前段时间由于工作需要,简单了解了一下UDP,参考了网上诸多大神的源码,终于整理出来一套可以使用的。
发送端
void socket_send(char data[], int len, char *IP, int _mRemoteHost)
{
//使用socket网络接口,第一步需要初始化socket接口
DWORD ver;//相当于无符号整数
WSADATA wsaData; //WSADATA为一个结构体
ver = MAKEWORD(1, 1);//在调用WSAStatrtup告诉Windows,我使用什么版本的socket
WSAStartup(ver, &wsaData);//只要用socket,第一步必须调用该函数
//初始化socket完成,固定格式
SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);
//SOCKET为变量类型一个指向无符号整数的指针,socket为函数
//socket第一个参数指定socket用那个协议,AF_INET为tcp/ip协议
//第二个参数SOCK_DGRAM:使用UDP协议。
//第三个参数一般默认填0.
//建立一个socket
//IP地址在电脑内部,为一个整数,使用特殊的结构存储。
struct sockaddr_in addr;//sockaddr_in可以表示tcp/ip协议族里的任何一种ip地址
memset(&addr, 0, sizeof(addr)); //结构体在函数参数中,被调用,应该使用取地址符"&".
addr.sin_family = AF_INET;//代表使用一个TCP/IP的地址
addr.sin_port = htons(_mRemoteHost);
//host(主机)to net short把主机代表的数转换为short型网络的一字节
inet_pton(AF_INET, IP, &addr.sin_addr);
char buf[1202] = { 0 };
sendto(st, (char*)&buf, 1202, 0, (struct sockaddr *)&addr, sizeof(SOCKADDR));
closesocket(st);//使用完socket要将其关闭
WSACleanup();//释放win socket内部的相关资源
}
接受端
void socket_recv(char data[], int len,char *IP,int _mRemoteHost)
{
DWORD ver;//相当于无符号整数
WSADATA wsaData; //WSADATA为一个结构体
ver = MAKEWORD(1, 1);//在调用WSAStatrtup告诉Windows,我使用什么版本的socket
WSAStartup(ver, &wsaData);
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(_mRemoteHost);
addr.sin_addr.S_un.S_addr = inet_addr(IP);//INADDR_ANY;//
::bind(s, (sockaddr*)&addr, sizeof(addr));
sockaddr_in addrClient;
int nSockAddrSize = sizeof(addrClient);
if (recvfrom(s, szBuff, sizeof(szBuff), 0, (sockaddr*)&addrClient, &nSockAddrSize) > 0)
{
//接收到的数据保存在szBuff数组内,可按自己要求添加
}
closesocket(s);
WSACleanup();
}