一、头文件及链接的库
#include <winsock2.h>
#include <WS2tcpip.h>
#pragma comment(lib,"WS2_32.lib")
二、代码实现
WORD w_req = MAKEWORD(2, 2);
//版本号
WSADATA wsadata;
int err = WSAStartup(w_req, &wsadata);
if (err != 0) return -1;
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) return -1;
//创建套接字
SOCKET UDP_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == UDP_socket)
{
err = WSAGetLastError();
printf("socket错误%d\n", err);
return -1;
}
//本地IP,用于邦套接字
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(9600);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
bool bOpt = true;
setsockopt(UDP_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
//绑定
err = bind(UDP_socket, (SOCKADDR*)&sin, sizeof(SOCKADDR));
if (SOCKET_ERROR == err)
{
err = WSAGetLastError();
printf("bind错误%d\n", err);
return -1;
}
//服务器地址
SOCKADDR_IN udp_from;
udp_from.sin_family = AF_INET;
udp_from.sin_port = htons(9600);
udp_from.sin_addr.s_addr = INADDR_BROADCAST;
int nAddrLen = sizeof(SOCKADDR);
while (1)
{
//接收阻塞
int nSize = recvfrom(UDP_socket, recv_buf, 400, 0, (SOCKADDR*)&udp_from, &nAddrLen);
if (nSize != SOCKET_ERROR)
{
sendto(UDP_socket, "\x66\x88\x23", 3, 0, (SOCKADDR*)udp_from, nAddrLen);
}
}