當前位置:編程學習大全網 - 編程語言 - LINUX C 進行TCP網絡連接,怎樣設置連接超時時間

LINUX C 進行TCP網絡連接,怎樣設置連接超時時間

如果妳確定,真的不需要等這麽久,或者用戶希望可以隨時中上連接過程,那麽壹般是用 非阻塞模式來做的. 看看我的這段連接代碼(節選),可以作為TCP連接的典範:

bool CRemoteLink::Connect()

{

OnDisconnected(); // 如果已經連接,則斷開

if(!m_bUseProxy)

{

m_iConnStatus = SS_CONNECTING; // 正在連接狀態

GNTRACE ("開始連接到遠程服務器[%s][%ld]...\n", m_strip.c_str(), m_port);

// 建立套接字, 準備連接到服務器

m_socket = ::socket(AF_INET, SOCK_STREAM, 0);

if (socket < 0) {

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);

return false;

}

// 設為異步操作方式

unsigned long on = 1;

if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {

::closesocket(m_socket);

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);

return false;

}

sockaddr_in addr;

memset(&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = inet_addr(m_strip.c_str());

addr.sin_port = htons(m_port);

int rt;

rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr));

if (rt == 0) {

OnConnected();

return true;

}

// ==================================================================

timeval to;

// 首先建立連接

fd_set wfds;

fd_set efds;

FD_ZERO(&wfds);

FD_ZERO(&efds);

// test shutdown event each 100ms.

to.tv_sec = 0;

// CONNECT_TIMEOUT;

to.tv_usec = 100000;

int it = 0;

while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0))

{

FD_SET(m_socket, &wfds);

FD_SET(m_socket, &efds);

int n = select(m_socket + 1, NULL, &wfds, &efds, &to);

if (n > 0) {

if(FD_ISSET(m_socket, &wfds))

{

OnConnected();

return true;

}

else

{

//int err = ::WSAGetLastError();

//const char* msg = GetLastErrorMessage(err);

GNTRACE ("CRemoteLink::Connect : connection attempt failed!\n");

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN);

break;

}

} else if (n < 0) { // Select Error

int err = ::WSAGetLastError();

const char* msg = GetLastErrorMessage(err);

GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %s\n", err, msg);

if(m_pCallBack)

m_pCallBack->OnSocketError(err, msg);

break;

}

else

{

it += 100;

if(it > 30000) // 連接超時 -- (30S)

{

GNTRACE ("CRemoteLink::Connect : Time out.\n");

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT);

break;

}

}

}

if(m_meConnStop.Wait(0))

{

GNTRACE("連接過程進行時被取消。\n");

}

}

else

{

// 通過代理服務器連接

  • 上一篇:求09年好聽的音樂
  • 下一篇:初中語文命題新思維_初中語文命題研究
  • copyright 2024編程學習大全網