C 非阻塞模式Socket程式設計

2021-06-21 13:32:31 字數 2664 閱讀 2293

iocserver.cpp:

#include

#include

using namespace std;

#include

#define buf_size 64

#pragma comment(lib,"ws2_32.lib")

int main()

//建立監聽的socket

sserver=socket(af_inet,sock_stream,ipproto_tcp);

if(invalid_socket==sserver)

//設定伺服器socket位址

sockaddr_in addrserv;

addrserv.sin_family=af_inet;

addrserv.sin_port=htons(9990);

addrserv.sin_addr.s_un.s_addr=htonl(inaddr_any);

//繫結sockets server

retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(sockaddr_in));

if(socket_error==retval)

//在sockets server上進行監聽

retval=listen(sserver,1);

if(socket_error==retval)

//設定socket為非阻塞模式

int imode = 1;

retval = ioctlsocket(sserver,fionbio,(u_long far*) &imode);

if(retval == socket_error)

//接受來自客戶端的請求

printf("tcpserver start...\n");

sockaddr_in addrclient;

int addrclientlen=sizeof(addrclient);

while(true)

else

}break;

}while(true)

else if(err == wsaetimedout || err == wsaenetdown)

}systemtime st;

getlocaltime(&st);

char sdatetime[30];

sprintf(sdatetime,"%4d-%2d-%2d-%2d:%2d:%2d:%2d",st.wyear,st.wmonth,st.wday,st.whour,st.wminute,st.wsecond);

//列印輸出的資訊

printf("%s,recv from client [%s:%d]:%s\n",sdatetime,inet_ntoa(addrclient.sin_addr),addrclient.sin_port,buf);

//如果客戶端傳送quit字串,則伺服器退出

if(strcmp(buf,"quit")==1)//

//否則向客戶端傳送回顯字串

else

else}}

break;}}

}iocclient.cpp:

#include

#include

#include

using namespace std;

#include

#define buf_size 64

#pragma comment(lib,"ws2_32.lib")

int main()

shost=socket(af_inet,sock_stream,ipproto_tcp);

//設定伺服器socket位址

servaddr.sin_family=af_inet;

servaddr.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");

//在實際應用中,建議將伺服器的ip位址和埠號儲存在配置檔案中

servaddr.sin_port=htons(9990);

//計算位址的長度

int sserveraddlen=sizeof(servaddr);

//呼叫ioctlsocket()將其設定為非阻塞模式

retval=ioctlsocket(shost,fionbio,(u_long far*)&imode);

if(retval==socket_error)

//迴圈等待

while(true)

else if(err==wsaeisconn)//已建立連線

else}}

while(true)

else

}break;

}while(true)

else if(err==wsaetimedout||err==wsaenetdown)//已建立連線

break;

}break;

}zeromemory(buf,buf_size);

retval=recv(shost,buf,sizeof(buf)+1,0);

printf("recv from server:%s\n",buf);

//如果接收到quit,則退出

if(strcmp(buf,"quit")==0)

}return 0;

}

非阻塞socket程式設計

socket程式設計中可能出現阻塞的呼叫有4個 1.write send sendto sendmsg sendv等,如果某個程序呼叫乙個阻塞的tcp套接字 預設設定 如果傳送緩衝區沒有空間,呼叫程序將會睡眠,直到有空間為止。如果tcp套接字是非阻塞的,且沒有空間可寫,則會返回乙個ewouleblo...

非阻塞socket程式設計

阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。該程序被標記為睡眠狀態並被排程出去。函式只有在得到結果之後才會返回。當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不...

非阻塞socket程式設計

阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。該程序被標記為睡眠狀態並被排程出去。函式只有在得到結果之後才會返回。當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不...