socket connec连接超时处理
最近把win32下的網(wǎng)關(guān)服務(wù)轉(zhuǎn)到linux平臺時遇到connect連接超時問題,經(jīng)過多方收集資料簡單整理下方便以后查找
linux或者win32控制臺程序中connect函數(shù)默認(rèn)是阻塞的,成功則返回0,失敗返回-1,錯誤碼可以用函數(shù)GetLastError獲得。如果連接一個打開的服務(wù)器一般回立即返回并且成功連接socket連接,如果連接一個存在但是沒有開啟的服務(wù)器會阻塞一段時間(不會太長)然后返回-1. 還有一種就是連接一個網(wǎng)內(nèi)不存在的服務(wù)器,比如192.168.0.256。這時就會阻塞很長的時間大概20+秒。這篇文章最初就是為了解決這個問題而寫的。
廢話不多說了進入正題(讀者:你的廢話已經(jīng)夠多了)。。。。。。。
為了處理connect的連接超時可以在調(diào)用socket函數(shù)之后使用fcntl函數(shù)將sock描述符設(shè)置為非阻塞,然后進行連接(connect),會立即返回-1,判斷錯誤碼是否等于EINPROGRESS,也就是判斷連接是不是正在進行中,如果是那么通過select查詢在一段時間內(nèi)該描述符是否可寫來判斷連接是成功還是失敗。如果錯誤碼不等于EINPROGRESS那么連接失敗。
// connect.cpp : 定義控制臺應(yīng)用程序的入口點。 //#include "stdafx.h"#include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) {//初始化套接字庫WSAData tWSAData;WSAStartup(MAKEWORD(2,2),&tWSAData);SOCKET sock;SOCKADDR_IN addr;memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(10086);addr.sin_addr.S_un.S_addr=inet_addr("192.168.50.103");fd_set r;unsigned long ul = 1;struct timeval timeo = {3, 0};//創(chuàng)建socket描述符if((sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){printf("socket fail");return -1;}//設(shè)置阻塞if(ioctlsocket(sock, FIONBIO, (unsigned long*)&ul) == SOCKET_ERROR){printf("ioctlsocket fail");return -1;}//初始化addr。。。。。。//發(fā)起連接if(connect(sock, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR){FD_ZERO(&r);FD_SET(sock,&r);if(select(0, 0, &r, 0, &timeo) <= 0) //需要注意select函數(shù)第一個參數(shù)在winsock被忽略了,//在linux必須是sock+1;{printf("connect fail");return -1;}else{printf("connect success");//to do}}send(sock,"123",3,0);return 0; }
總結(jié)
以上是生活随笔為你收集整理的socket connec连接超时处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用IDA PRO+OllyDbg+PE
- 下一篇: 使用IDA的调试器