测试如何设置SOCKET的KeepAlive选项
http://www.chinaitpower.com/A/2004-07-26/87664.html
作者:佚名 时间:2004-07-26 10:42 出处:互连网 责编:chinaitpower 摘要:测试如何设置SOCKET的KeepAlive选项 //程序如下所示: //以下宏需要自定义 #define SIO_RCVALL IOC_IN | IOC_VENDOR | 1 #define SIO_RCVALL_MCAST IOC_IN | IOC_VENDOR | 2 #define SIO_RCVALL_IGMPMCAST IOC_IN | IOC_VENDOR | 3 #define SIO_KEEPALIVE_VALS IOC_IN | IOC_VENDOR | 4 #define SIO_ABSORB_RTRALERT IOC_IN | IOC_VENDOR | 5 #define SIO_UCAST_IF IOC_IN | IOC_VENDOR | 6 #define SIO_LIMIT_BROADCASTS IOC_IN | IOC_VENDOR | 7 #define SIO_INDEX_BIND IOC_IN | IOC_VENDOR | 8 #define SIO_INDEX_MCASTIF IOC_IN | IOC_VENDOR | 9 #define SIO_INDEX_ADD_MCAST IOC_IN | IOC_VENDOR | 10 #define SIO_INDEX_DEL_MCAST IOC_IN | IOC_VENDOR | 11 //自定义的结构体 typedef struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }TCP_KEEPALIVE,*PTCP_KEEPALIVE; int main(int argc, char* argv[]) { WSADATA wsaData = {0}; if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { cout << "WSAStartup failed. error code = " << WSAGetLastError() << endl; cout << "Press any key exit." << endl; getch(); return 0; } SOCKET s = INVALID_SOCKET; // s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { cout << "socket failed. error code = " << WSAGetLastError() << endl; } else { int iKeepAlive = -1; int iOptLen = sizeof(iKeepAlive); //取得SO_KEEPALIVE选项信息 if (getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, &iOptLen) == SOCKET_ERROR) { cout << "getsockopt failed. error code = " << WSAGetLastError() << endl; } else { iKeepAlive = 1; //这里设置成功的Keep Alive是针对操作系统的所有网络通信 if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, iOptLen) == SOCKET_ERROR) { cout << "setsockopt failed. error code = " << WSAGetLastError() << endl; } else { iKeepAlive = -1; if (getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, &iOptLen) == SOCKET_ERROR) { cout << "getsockopt failed. error code = " << WSAGetLastError() << endl; } else if (iKeepAlive == 1) { TCP_KEEPALIVE inKeepAlive = {0}; unsigned long ulInLen = sizeof(TCP_KEEPALIVE); TCP_KEEPALIVE outKeepAlive = {0}; unsigned long ulOutLen = sizeof(TCP_KEEPALIVE); unsigned long ulBytesReturn = 0; //设置socket的keep alive为10秒,并且发送次数为3次 inKeepAlive.onoff = 1; inKeepAlive.keepaliveinterval = 10000; inKeepAlive.keepalivetime = 3; //为选定的SOCKET设置Keep Alive,成功后SOCKET可通过Keep Alive自动检测连接是否断开 if (WSAIoctl(s, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen, (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL) == SOCKET_ERROR) { cout << "WSAIoctl failed. error code = " << WSAGetLastError() << endl; } } } } } WSACleanup(); cout << "Press any key exit." << endl; getch(); return 0;