當前位置:歷史故事大全網 - 歷史天氣 - 如何判斷SOCKET還是連接著的

如何判斷SOCKET還是連接著的

// 判斷是否連接

char ch = 'A';

if (read(g_sockfd, &ch, 1)<=0)

{

if (connect(g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

{

ServiceLog.write_log("[NotifyDAU]:connect to DAU success.");

}

else

{

ServiceLog.write_log("[NotifyDAU]:can't connect to DAU ");

return;

}

}

用try{}catch{}是比較合適。

當他是連著的,當進行通訊時發生異常後就知道了.

當妳不斷的read的時候,server斷,exception就catch到了。

2. 心跳包

可不可以在Client設壹個定時器,每隔壹段時間發壹條消息給服務器,看能不能收到服務器的響應。

心跳包就是定時發包,沒回應就判斷斷開。

3. getsockopt

int optval, optlen = sizeof(int);

getsockopt(sd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen);

switch(optval){

case 0:

//“處於連接狀態“

break;

case ECONNREFUSED:

case EHOSTNUMREACH:

}

4. 項目中使用的情況

// 判斷是否連接

int optval, optlen = sizeof(int);

int r = getsockopt(g_sockfd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen);

// send HELLO 包

if ((optval == 0) && (r == 0) && (send(g_sockfd,(char*)&g_DAUCommand,sizeof(struct _DAUCommand),0) != SOCKET_ERROR ))

{

ServiceLog.write_log("[threadOperationWaitTrasferAgain]: try to recv from dau...");

length = recv(g_sockfd,(char *)&command,sizeof(struct _DAUCommand),0);

}

else

{

if (connect(g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

{

ServiceLog.write_log("[threadOperationWaitTrasferAgain]:connect to DAU success.");

ServiceLog.write_log("[threadOperationWaitTrasferAgain]: try to recv from dau...");

length = recv(g_sockfd,(char *)&command,sizeof(struct _DAUCommand),0);

}

else

{

ServiceLog.write_log("[threadOperationWaitTransferAgain]:can't connect to DAU, try again ");

length = 0;

continue;

}

}

  • 上一篇:改變壹生的閃念
  • 下一篇:什么是班昭续《汉书》之谜?
  • copyright 2024歷史故事大全網