Soket 编程 连接发送信息 udp

转载

http://www.cnblogs.com/zengqinglei

本篇文章主要实现Socket在Udp协议下相互通讯的方式。(服务器端与客户端的通讯)


基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)

    (1).建立一个套接字(Socket)

    (2).绑定服务器端IP地址及端口号--服务器端

    (3).通过SendTo()方法向指定主机发送消息(需提供主机IP地址及端口)

    (4).通过ReciveFrom()方法接收指定主机发送的消息(需提供主机IP地址及端口)

    

服务器 端

#include <stdio.h>  
#include <WINSOCK2.H>  
#include<iostream>
#include<time.h>

#pragma comment(lib,"WS2_32.lib")  
#define BUF_SIZE    64  
using namespace std;
int main(void)
{
	SYSTEMTIME st = { 0 };
	GetLocalTime(&st);
	printf("%02d:%02d:%02d\n",
		
		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接1" << endl;
	WSADATA wsd;
	SOCKET  s;
	int     nRet;

	// 初始化套接字动态库  
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
	{
		printf("WSAStartup failed !/n");
		return 1;
	}

	// 创建套接字  
	s = socket(AF_INET, SOCK_DGRAM, 0);
	if (s == INVALID_SOCKET)
	{
		printf("socket() failed ,Error Code:%d/n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	SOCKET      socketSrv = socket(AF_INET, SOCK_DGRAM, 0);
	SOCKADDR_IN addrSrv;
	SOCKADDR_IN addrClient;
	char        buf[BUF_SIZE];
	int         len = sizeof(SOCKADDR);

	// 设置服务器地址  
	ZeroMemory(buf, BUF_SIZE);
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.1.0.2");
		//htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(8888);

	// 绑定套接字  
	nRet = bind(socketSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
	if (SOCKET_ERROR == nRet)
	{
		printf("bind failed !/n");
		closesocket(s);
		WSACleanup();
		return -1;
	}

	// 从客户端接收数据  
	//getchar();
	printf("%02d:%02d:%02d\n",
		
		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接2" << endl;

	nRet = recvfrom(socketSrv, buf, BUF_SIZE, 0, (SOCKADDR*)&addrClient, &len);

	printf("%02d:%02d:%02d\n",

		st.wHour,
		st.wMinute,
		st.wSecond);

	cout << "udp连接3" << endl;

	if (SOCKET_ERROR == nRet)
	{
		printf("recvfrom failed !/n");
		closesocket(s);
		WSACleanup();
		return -1;
	}
	// 打印来自客户端发送来的数据  
	printf("Recv From Client:%s/n", buf);
	cout << endl;

	// 向客户端发送数据  
	cout <<"发送数据"<< endl;
	char a[20];
	cin >> a;
	sendto(socketSrv, a, 20, 0, (SOCKADDR*)&addrClient, len);
	closesocket(s);
	WSACleanup();
	system("pause");
	return 0;
}

客户端

#include <stdio.h>  
#include <WINSOCK2.H>  
#include<iostream>
#include<time.h>
#pragma comment(lib,"WS2_32.lib")  
#define BUF_SIZE    64  
using namespace std;
int main(void)
{
	SYSTEMTIME st = { 0 };
	GetLocalTime(&st);
	printf("%02d:%02d:%02d\n",

		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接1" << endl;
	WSADATA wsd;
	SOCKET  s;

	// 初始化套接字动态库  
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
	{
		printf("WSAStartup failed !/n");
		return 1;
	}

	// 创建套接字  
	s = socket(AF_INET, SOCK_DGRAM, 0);
	if (s == INVALID_SOCKET)
	{
		printf("socket() failed, Error Code:%d/n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	char        buf[BUF_SIZE];  // 接受数据  
	SOCKADDR_IN servAddr;       // 服务器套接字地址  
	SOCKET      sockClient = socket(AF_INET, SOCK_DGRAM, 0);
	int         nRet;

	ZeroMemory(buf, BUF_SIZE);
	strcpy(buf, "UDP Hello  server");

	// 设置服务器地址  
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.S_un.S_addr = inet_addr("127.1.0.2");
	servAddr.sin_port = htons(8888);

	// 向服务器发送数据  
	int nServAddLen = sizeof(servAddr);
	printf("%02d:%02d:%02d\n",

		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接2" << endl;

	if (sendto(sockClient, buf, BUF_SIZE, 0, (sockaddr *)&servAddr, nServAddLen) == SOCKET_ERROR)
	{
		printf("recvfrom() failed:%d/n", WSAGetLastError());
		closesocket(s);
		WSACleanup();
		getchar();
		return 1;
	}

	printf("%02d:%02d:%02d\n",

		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接3" << endl;
	nRet = recvfrom(sockClient, buf, BUF_SIZE, 0, (sockaddr *)&servAddr, &nServAddLen);
	
	if (SOCKET_ERROR == nRet)
	{
		printf("recvfrom failed !/n");
		
		closesocket(s);
		WSACleanup();
		getchar();
		return -1;
	}

	// 打印来自服务端发送来的数据  
	printf("%02d:%02d:%02d\n",

		st.wHour,
		st.wMinute,
		st.wSecond);
	cout << "udp连接4" << endl;

	printf("Recv From Server:%s/n", buf);
	closesocket(s);
	WSACleanup();
	getchar();
	
	return 0;
}

先启动服务端  接收信息 等待客户端连接 客户端连接成功 发送消息 服务端发送信息给客户端 。





猜你喜欢

转载自blog.csdn.net/qq_33473476/article/details/78593019
今日推荐