3.#include//一定要包含该头文件因为该头文件包含了socket api函数声名
4.
5.usingnamespacestd;
6.
7.#pragmacomment(lib,"WS2_32.lib") //windwows下的socket编程函数库
8.
9.
10.classCInitSock
11.{
12.public:
13.CInitSock(intversion01=2,intversiont02=2)
14.{
15. WORDsockVersion=MAKEWORD(2,2); //声名一个存放windows网络编程库的版本号信息的数据
16.WSADATAwsaData={0};
17.
//WSAStartup函数是在程序中初始化并加载Windows网络
//编程库的ws2_32.dll动态库文件。这个很重要。
18.if(WSAStartup(sockVersion,&wsaData)!=0)
19.{
20.cout<
21.
22.exit(0); //如果WSAStartup返回值为1的话就表示ws2_32.dll文件有问题,程序退出
23.}
24.
25.}
26.
27.~CInitSock()
28.{
29.WSACleanup(); //在析构CInitSock类时释放ws2_32.dll动态库
30.}
31.};
32.
33.CInitSockmysock;
34.
35.intmain()
36.{
37.SOCKETs=0; //声明一个UDP通信的socket数据结构
38.sockaddr_insin={0}; //声名一个socket编程类型的网络地址数据结构以便connect函数对本
//机创建的socket数据结构进行初始化。
39.
40.sin.sin_family=AF_INET; //设置网络协议族类型
41.sin.sin_port=htons(4567); //设置本地计算机的端口号
42.sin.sin_addr.S_un.S_addr=INADDR_ANY; //设置本地计算机的IP地址
43.
44.s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //在本机上创建一个socket
45.
//使用bind函数绑定本机的ip和打开端口到本机创建的socket结构上,并初始化该socket
//重点说明一个在服务器上是用bind函数来初始化socket,在UDP通信程序中客户端不需初始化
//socket
46.if(bind(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
47.{
48.cout
50.return0; //如果socket绑定失败返回程序0并退出程序
51.}
52.
53.charbuffer[1024]="\0"; //向数据缓存区的未尾添加一个字符串结束符
54.sockaddr_inaddr={0}; //声名一个socket编程类型的网络地址数据结构用来保存从网络接收
//到的数据的发送端IP地址和端口号
55.intnLen=0;
56.
57.nLen=sizeof(sockaddr_in);
58.
59.cout
61.while(true)
62.{
63.intnRecv=0;
64.
65.cout
//recvfrom是UDP通讯程序的接收函数,recv是TCP程序的接收函数来的。
//其中recvfrom函数个个参数的意义如下:
//s是一个本机创建的socket结构来的
//buffer是本机用来存放接收到的网络数据的缓冲区
//1024是指定这个接收缓冲区(这里指buffer)的大小
//addr就是一个sockaddr的结构
//nLen是指示从网络上接收数据包的实际字节长度
67.nRecv=recvfrom(s,buffer,1024,0,(sockaddr*)&addr,&nLen);
68.
69.if(nRecv>0) //判断是否有数据接收到,如果nRecv大于0就表示接收来数据
70.{
71.buffer[nRecv]='\0';
72.
73.cout
75.}
76.
77.closesocket(s); //关闭这个以经打开的socket结构
78.}
完结。