套接字中connect阻塞與非阻塞問題

2021-08-10 13:01:10 字數 1251 閱讀 3829

1

intpascal far connect (socket s,conststructsockaddr far *name,intnamelen);

(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 方法,設定非阻...