當前位置:編程學習大全網 - 編程語言 - C語言 UDP中revcfrom怎麽從阻塞中跳出?

C語言 UDP中revcfrom怎麽從阻塞中跳出?

在創建套接口後調用壹下ioctlsocket()函數,設置為非阻塞即可,如下:

//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;

}

  • 上一篇:effortless的漢語是什麽意思
  • 下一篇:大學數學實驗(第二版) 清華大學出版社 實驗8 線性規劃 第5題 某市有甲乙丙丁四個居民區,自來水由ABC
  • copyright 2024編程學習大全網