1
int
pascal far connect (socket s,
const
struct
sockaddr far *name,
int
namelen);
(1)如果伺服器端程式已經執行, 客戶端執行connect()函式,正常沒問題,
(2)如果服務端程式沒有執行的時候,客戶端執行connect()函式,會在此函式停留很長時間,整個程式介面幾乎死掉,要3秒左右才能執行完connect()函式並返回結果,
請問如何在(2)的情況下讓connect函式立刻返回?
//設定非阻塞方式連線
unsigned long ul = 1;
ret = ioctlsocket(cclient, fionbio, (unsigned long*)&ul);
if(ret==socket_error)return 0;
//連線
server.sin_family = af_inet;
server.sin_port = htons(25);
server.sin_addr .s_addr = inet_addr((lpcstr)psmtp);
if(server.sin_addr.s_addr == inaddr_none)
connect(cclient,(const struct sockaddr *)&server,sizeof(server));
//select 模型,即設定超時
struct timeval timeout ;
fd_set r;
fd_zero(&r);
fd_set(cclient, &r);
timeout.tv_sec = 15; //連線超時15秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
//一般非鎖定模式套接比較難控制,可以根據實際情況考慮 再設回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(cclient, fionbio, (unsigned long*)&ul1);
if(ret==socket_error){
::closesocket (cclient);
return 0;
非阻塞 connect套接字
非阻塞connect套接字的作用 1 完成乙個connect要花費rtt時間,而rtt波動範圍很大,從區域網上的幾個毫秒甚至是廣域網上的幾秒,這段時間也許有我們要執行的其他處理工作可以執行。2 可以使用這個技術同事建立多個連線。3 許多connect的超時實現以75秒為預設值,如果應用程式想自定義乙...
43 TCP套接字之connect非阻塞
本節來將客戶端的connect阻塞式改為非阻塞式.這樣可以同時向服務端發起多個連線並一起進行處理,非阻塞connect一般用來測試服務端的抗壓能力.connect設定為非阻塞之後會立即返回 設定errno為einprogress錯誤,表示連線操作正在進行中,但是仍未完成連線 同時tcp的三次握手操作...
非阻塞套接字
建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...