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工作在阻塞模式的時候,如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不...