流程一:
int iSck = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8000);
saddr.sin_addr.s_addr = inet_addr("192.168.1.233");int ret = 0;
unsigned long ulNoBlock = 1;
ret = ioctlsocket(iSck, FIONBIO, (unsigned long*)&ulNoBlock);
if(ret==SOCKET_ERROR)
return;int iError = WSAGetLastError();
ret = connect(iSck, (LPSOCKADDR)&saddr, sizeof(saddr));
iError = WSAGetLastError();struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(iSck, &r);
timeout.tv_sec = 10;
timeout.tv_usec =0;
int max = 1;if (ret<0)
{
if (iError==WSAEWOULDBLOCK)
{
ret = select( max+1, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
iError = WSAGetLastError();
::closesocket(iSck);
return;
}
else
{
... //说明连接成功,可以send recv数据了
}
}
else
{
//连接有异常,关闭socket
::closesocket(iSck);
return;
}
}
else
{
... //说明连接成功,可以send recv数据了
}
...流程二:
int iSck = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8000);
saddr.sin_addr.s_addr = inet_addr("192.168.1.233"); int iError = WSAGetLastError();
ret = connect(iSck, (LPSOCKADDR)&saddr, sizeof(saddr));
if (ret<0)
{
iError = WSAGetLastError();
::closesocket(iSck);
return;
}
... //说明连接成功,可以send recv数据了
做这个实验,假设目标主机8000端口未打开当连接内网主机192.168.1.233时
流程一很慢,一定要等到设置的超时10s到,并且我不知道如何得到失败原因,表现很差,我不喜欢;
流程二很迅速,并能getlasterror能得到错误码是10061,意思是对方拒绝,表现很好,我喜欢;当连接外网主机202.168.1.233时,当然该主机是不存在的
流程一一定要等到设置的超时10s到,这个时间是可以控制的,并且我不知道如何得到失败原因,表现比流程二稍强,我喜欢;
流程二很慢,大约要20秒,能getlasterror能得到错误码是10060,意思是连接timeout,表现不太好,我不喜欢;大家觉得我的理解(包话注释)对不对,请指教;
int iSck = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8000);
saddr.sin_addr.s_addr = inet_addr("192.168.1.233");int ret = 0;
unsigned long ulNoBlock = 1;
ret = ioctlsocket(iSck, FIONBIO, (unsigned long*)&ulNoBlock);
if(ret==SOCKET_ERROR)
return;int iError = WSAGetLastError();
ret = connect(iSck, (LPSOCKADDR)&saddr, sizeof(saddr));
iError = WSAGetLastError();struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(iSck, &r);
timeout.tv_sec = 10;
timeout.tv_usec =0;
int max = 1;if (ret<0)
{
if (iError==WSAEWOULDBLOCK)
{
ret = select( max+1, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
iError = WSAGetLastError();
::closesocket(iSck);
return;
}
else
{
... //说明连接成功,可以send recv数据了
}
}
else
{
//连接有异常,关闭socket
::closesocket(iSck);
return;
}
}
else
{
... //说明连接成功,可以send recv数据了
}
...流程二:
int iSck = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8000);
saddr.sin_addr.s_addr = inet_addr("192.168.1.233"); int iError = WSAGetLastError();
ret = connect(iSck, (LPSOCKADDR)&saddr, sizeof(saddr));
if (ret<0)
{
iError = WSAGetLastError();
::closesocket(iSck);
return;
}
... //说明连接成功,可以send recv数据了
做这个实验,假设目标主机8000端口未打开当连接内网主机192.168.1.233时
流程一很慢,一定要等到设置的超时10s到,并且我不知道如何得到失败原因,表现很差,我不喜欢;
流程二很迅速,并能getlasterror能得到错误码是10061,意思是对方拒绝,表现很好,我喜欢;当连接外网主机202.168.1.233时,当然该主机是不存在的
流程一一定要等到设置的超时10s到,这个时间是可以控制的,并且我不知道如何得到失败原因,表现比流程二稍强,我喜欢;
流程二很慢,大约要20秒,能getlasterror能得到错误码是10060,意思是连接timeout,表现不太好,我不喜欢;大家觉得我的理解(包话注释)对不对,请指教;
解决方案 »
- Visual 2005下 "File View" 不见了
- 有一个usb的无线网卡,请问如何编程实现抓取到经过无线网卡上的数据包, windows环境?
- GSM短信发送PDU编码解码C++消息队列调用 哪位老兄调试后能读取短信阿,现在只是能发
- 我想在我的中调用一个isapi的dll,能实现吗?
- WSAGetLastError()返回2是什么意思啊?简直是灵异事件!
- 再问右键菜单问题
- 在c++中,如何调用用c写的库函数,我用extern "c" ,报重复定义错误。
- 关于winsock2 中的blocking模式和消息处理方式
- 散分了,
- 关于VC编译器的问题,回答给分
- 各位大哥,怎么知道tcp缓冲区有没有数据。
- vs2008 在win7 32位下面编译的程序,在xp +sp3 上面运行不了.
流程一很慢,一定要等到设置的超时10s到,并且我不知道如何得到失败原因,表现很差,我不喜欢;
流程二很迅速,并能getlasterror能得到错误码是10061,意思是对方拒绝,表现很好,我喜欢;
----------------
楼主的意思是端口不可达,select也可以做到迅速判断,select( max+1, &r, &w, 0, &timeout);
应该同时检测第二个参数fd_set* readfds,这样select立即返回,继而recv会得到RESET报文的的错误,判定连接失败
一般来说,要控制connect时间,都用select模型
http://hi.baidu.com/zxhouse/blog/item/9e89fd644e768ff6f73654c0.html不过看到这贴子上也有人评论说用第二个参数r即可,不必用e,为何我的还不行,另本人是winxp平台;