CSocket如何设置连接超时
CSocket怎么设置连接超时?
写了个网络程序,在MFC做的,用了CSocket,都做完了,才发现如果在连接的IP不存在的情况下,需要等待20秒左右才会返回连接错误。在不改成CAsyncSocket的情况下,能设置连接超时吗?在网上搜了无数种方法来设置连接超时,都不管用,仍然是要等20秒。
即便是我用了个Timer来返回,也是要等到20秒之后才执行。
比如,我用一个变量 int a = 0;如果连接成功时令a=1。用Timer过3秒检测a的值。我是先SetTimer,然后再Connect的。
但是我发现,SetTimer中的事件是要等到Connect返回了值之后才开始执行的。也就是如果连接的IP不存在,仍然要先等20秒。
谁能指点一下吗?先谢谢了。
------解决方案--------------------
int setsockopt(
SOCKET s,
int level,
int optname,
const char* optval,
int optlen
);
SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
SO_SNDTIMEO int Sends time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
------解决方案--------------------
------解决方案--------------------
Sorry
return setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
-->
return SOCKET_ERROR != setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
------解决方案--------------------
在建立好socket之后,调用connect之前,先设置socket为非阻塞模式。
还是给你个例子吧
写了个网络程序,在MFC做的,用了CSocket,都做完了,才发现如果在连接的IP不存在的情况下,需要等待20秒左右才会返回连接错误。在不改成CAsyncSocket的情况下,能设置连接超时吗?在网上搜了无数种方法来设置连接超时,都不管用,仍然是要等20秒。
即便是我用了个Timer来返回,也是要等到20秒之后才执行。
比如,我用一个变量 int a = 0;如果连接成功时令a=1。用Timer过3秒检测a的值。我是先SetTimer,然后再Connect的。
但是我发现,SetTimer中的事件是要等到Connect返回了值之后才开始执行的。也就是如果连接的IP不存在,仍然要先等20秒。
谁能指点一下吗?先谢谢了。
------解决方案--------------------
int setsockopt(
SOCKET s,
int level,
int optname,
const char* optval,
int optlen
);
SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
SO_SNDTIMEO int Sends time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
------解决方案--------------------
BOOL SetTimeOut(SOCKET s, int nTime, BOOL bRecv)
{
return setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
}
------解决方案--------------------
Sorry
return setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
-->
return SOCKET_ERROR != setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
------解决方案--------------------
在建立好socket之后,调用connect之前,先设置socket为非阻塞模式。
还是给你个例子吧
int TCP_Connect(const char *serverIP, int port, int iTimeOut)
{
struct timeval tv;
int error;
fd_set writefds;
struct sockaddr_in servaddr;
int ret;
u_long ul = 1;//设置非阻塞方式连接
BOOL bNodelay = TRUE;
//1.socket
int fd = socket(PF_INET,SOCK_STREAM, 0);
if(fd <=0 )
{
LogError("create socket failed.%s", strerror(errno));
fd = 0;
return -1;
}
//2.fcntl
#ifdef LINUX_PLATFORM
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)
------解决方案--------------------
O_NONBLOCK);
#else
if(ioctlsocket(fd, FIONBIO, (unsigned long*)&ul) != 0)
{
LogError("ioctlsocket socket failed:%ld", GetLastError());
}
#endif
//3.connect
//bzero(&servaddr, sizeof(servaddr));
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
#ifdef LINUX_PLATFORM
inet_aton((const char*)serverIP, &servaddr.sin_addr);
#else
servaddr.sin_addr.S_un.S_addr = inet_addr(serverIP);
#endif
servaddr.sin_port = htons(port);
if(iTimeOut <= 0)
{
iTimeOut = 5;
}
if(connect(fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{ //if(connect failed)
#ifdef LINUX_PLATFORM