//UDPServer.cpp
#pragma comment(lib,"ws2_32.lib")
#include<winsock2.h>
#include<stdio.h>
#include<string.h>
int main()
{
WSADATA wsaData;
int err = WSAStartup(WINSOCK_VERSION,&wsaData);
if(err!=0)
{
printf("Socket start failed:%d\n",err);
return -1;
}
//創建套接口:socket()
SOCKET sock;
sock = socket(AF_INET,SOCK_DGRAM,0);
//!!在此設置非阻塞!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long iMode = 1;//為0時阻塞,非0時不阻塞
::ioctlsocket(sock,FIONBIO,&iMode);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(sock==INVALID_SOCKET)
{
printf("Creat socket Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
//綁定端口:bind()
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(8800);
localaddr.sin_addr.s_addr = htonl(INADDR_ANY); //#define s_addr S_un.S_addr
err = bind(sock,(sockaddr *)&localaddr,sizeof(localaddr));//調用bind()綁定端口
if(err == SOCKET_ERROR) //出錯處理
{
printf("Bind failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
//等待接收信息
char rbuf[1024];
sockaddr_in faraddr;
int farlen = sizeof(faraddr);
printf("Server is startup! Waiting for message:\n");
//do
while(true)
{
memset(rbuf,0,1024); //清空接收緩沖區rbuf[1024]
int rByte = recvfrom(sock,rbuf,1024,0,(sockaddr *)&faraddr,&farlen);//阻塞等待
if(rByte == SOCKET_ERROR)
{
printf("Recvfrom failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
printf("UDP Recv %d Data from %s:%s\n",rByte,inet_ntoa(faraddr.sin_addr),rbuf);
if(strlen(rbuf)==0)
{
printf("Client %s have finished!\n",inet_ntoa(faraddr.sin_addr));
}
}//while(strlen(rbuf)!=0);//收到空數據包,則認為對方已經發送完成
return 0;
}