本程序使用VS2008编写,代码如下:
- //先打开服务器端,服务器在执行完recvfrom()后堵塞,等待接收数据...
- #include <winsock2.h>
- #include <stdio.h>
- #pragma comment(lib,"WS2_32.LIB")
- void main()
- {
- WSADATA wsaData;
- SOCKET ReceivingSocket;
- SOCKADDR_IN ReceiverAddr;
- int Port = 8060;
- char ReceiveBuf[1024] = {0};
- int BufLength = 1024;
- SOCKADDR_IN SenderAddr;
- int SenderAddrSize = sizeof(SenderAddr);
- int Ret;
- //初始化Winsock 2.2版本
- if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) !=0)
- {
- printf("ERROR:WSAStartup failed with %d/n",Ret);
- return;
- }
- //创建一个新的套接字来接收数据报
- if((ReceivingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == INVALID_SOCKET)
- {
- printf("ERROR:SOCKET failed with %d/n",WSAGetLastError());
- WSACleanup();
- return;
- }
- //建立一个SOCKDDR_IN结构,这个结构将告知bind我们想要使用5150端口接收来自
- //所有接口的数据报
- ReceiverAddr.sin_family = AF_INET;
- ReceiverAddr.sin_port = htons(Port);
- ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- //使用bind将这个地址信息和套接字关联起来
- if((bind(ReceivingSocket,(SOCKADDR*)&ReceiverAddr,sizeof(ReceiverAddr))) == SOCKET_ERROR)
- {
- printf("ERROR:bind failed with %d/n",WSAGetLastError());
- closesocket(ReceivingSocket);
- WSACleanup();
- return;
- }
- 先打开服务器端,服务器在执行完recvfrom()后堵塞,等待接收数据...
- printf("wait to receive data.../n");
- if((Ret = recvfrom(ReceivingSocket,ReceiveBuf,BufLength,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize))
- == SOCKET_ERROR)
- {
- printf("ERROR: recvfrom failed with error %d/n", WSAGetLastError());
- closesocket(ReceivingSocket);
- WSACleanup();
- return;
- }
- printf("We successfully received %d bytes from address %s:%d./n", Ret,
- inet_ntoa(SenderAddr.sin_addr), ntohs(SenderAddr.sin_port));
- for(int id=0; id<5 ; ++id)
- printf("%c",ReceiveBuf[id]);
- //应用程序结束接收数据报后,关闭套接字
- closesocket(ReceivingSocket);
- //应用程序结束后,调用WSACleanup
- WSACleanup();
- }