How to set up a connection timeout in Socket

xiaoxiao2021-03-06  15

Create Socket

Struct SockAddr_in addr; addr.sin_family = af_INET;

// server address addr.sin_addr.s_addr = inet_addr (host); // server port addr.sin_port = htons (port);

// Creating Socket IF ((SoC = Socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == Invalid_Socket) Throw connector_exception ("Connector: can't create socket);

2. Connect

IF (:: Connect (STRUCKADDR *) & addr, sizeof (addr) == SOCKET_ERROR) THROW Connector_Exception ("Connector: CAN't Connect.");

3. Set to non-blocking SOCKET

Unsigned long ul = 1; int RET = ioctlsocket (Rec (), fionbio, (unsigned long *) & ul); if (RET == Socket_ERROR) log << "ioctlsocket error" << ENDL; 4. Select Socket

FD_ZERO (& r_readfds); fd_zero (& R_EXFDS); fd_set (REC (), & r_readfds; fd_set (REC (), & r_exfds; if ((IRET = SELECT (0, & r_readfds, null, & r_exfds, & TV)) == SOCKET_ERROR) {After each call SELECT, the SELECT function automatically sets R_READFDS, R_EXFDS, must be reused fd_zero (& r_Eadfds); fd_zero (& r_exfds); fd_set (REC (), & r_readfds); fd_set (REC (), & r_exfds Otherwise, the 10022 WSAEINVAL error is automatically emptied because SELECT will automatically empty R_READFDS, R_EXFDS. However, if it is not overtime, it will not be emptied, so you want to call fd_zero (& r_readfds); fd_zero (& r_exfds);

5 reference

Http://support.microsoft.com/kb/q147714/

转载请注明原文地址:https://www.9cbs.com/read-45581.html

New Post(0)