1. UDP服务端与客户端编程流程

2. 编写UDP_Server代码
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
WSADATA wd;
if(WSAStartup(MAKEWORD(2,2), &wd) != 0)
{
cout << "WSAStartup Error:" << WSAGetLastError() << endl;
return 0;
}
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in));
addr.sin_port = htons(8000);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
int len = sizeof(SOCKADDR);
if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR)
{
cout << "bind error:" << WSAGetLastError() << endl;
return 0;
}
int nNetTimeout = 5000;
if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)) == SOCKET_ERROR)
{
cout << "setsockopt error:" << GetLastError() << endl;
return 0;
}
int ret=0;
do
{
sockaddr_in addrClient;
memset(&addrClient, 0, sizeof(addrClient));
int len = sizeof(SOCKADDR);
char buf[100] = {0};
ret = recvfrom(s, buf, 100, 0, (SOCKADDR*)&addrClient, &len);
cout << "recvfrom " << len << " :" << buf << endl;
ret = sendto(s, "I am UDP Server!", strlen("I am UDP Server!"), 0, (SOCKADDR*)&addrClient, len);
} while (ret!=SOCKET_ERROR && ret!=0);
closesocket(s);
WSACleanup();
return 0;
}