简单问题:如何使用非阻塞(nonblocking) connect ? rt. 立刻给分! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我发现我真该去买本书了,只看MSDN真头疼~~~~~~~ 楼主在学习非阻塞的socket模型以前最好是对socket通信的基本知识有所了解然后就是需要看一下非阻塞的各种模型了:比较简单的,select模型WSAAsyncSelect模型WSAEventSelect模型比较复杂的,重叠模型完成端口模型这些模型多多少少都要比阻塞模型复杂,但是也能带来更好的性能具体楼主最好是买本书了,里面的东西很多的^_^ 我了解模型,但不知道代码怎么写(我很晕,是吧?其实阻塞的代码我都做好了。 ^_^)哪位大侠能指点一下救急啊~~~~~~(不是不想买书,现在实在没机会 & 条件,以后肯定要买的)还有啊,socket是POSIX兼容标准的,不要用WSA*系列。 阻塞是一种机制而已,不一定要使用WSA系列函数。另外指出小猪的错误:select模型跟阻塞非阻塞无关。非阻塞的意义在于调用send,recv的时候会立即返回,而不去管数据是不是处理完了。 哦,呵呵,不好意思*^_^*我没用过select模型,一直以为是非阻塞的呢我倒是用非阻塞模型做过东西,但是把代码都发给你你会晕的,因为里面还有很多别的东西呵呵其实《windows网络编程》是一本很好的书,如果楼主是专门从事网络编程的话,这本书很值得珍藏的^_^ 设置socket为非阻塞!然后connet!还原socket再select!再connect int CTcp::recv(int sd, char *buf, int len, int timeout){ int len1, len_recv; time_t t2, t1; len_recv =0; time(&t1); t2 =t1; int err =0; int counter=0; while(len_recv <len) { if(t2 -t1 >timeout) { WSASetLastError(err); return len_recv; } if(status(sd, "r", timeout-(t2-t1)) <0) { err =WSAGetLastError(); //WriteStat("tcp_status err=%d", WSAGetLastError()); WSASetLastError(err); return len_recv; } if((len1 =::recv(sd, &buf[len_recv], len-len_recv, 0)) <=0) { err =WSAGetLastError(); //WriteStat("recv err=%d, len1=%d", err, len1); if(timeout ==0) break; if(len1 ==SOCKET_ERROR && err ==WSAEWOULDBLOCK) { time(&t2); if(counter++>100) { Sleep(100); counter=0; } continue; } WSASetLastError(err); return len_recv; } len_recv +=len1; time(&t2); } WSASetLastError(err); return len_recv;} ioctlsocket(sd, FIONBIO, (unsigned long *)&l) 正在读取数据,请稍候,这个提示怎么做? 下面两种使用CString的方法有什么不同? 请教:我的VC++代码中关于文件读写的问题 高分,关于DDV与DDX~ 急急急 有哪位大侠知道,数据库格式转换 (高分) 检测鼠标 VC操作数据库中_RecordsetPtr::Open() 如何在ListBox中实现如下功能? DLL调用函数问题 请问如何在命令行(Command-Line)编译.RC资源文件?急!急!急! 对框框简单问题 问一个有关继承的基本问题
select模型
WSAAsyncSelect模型
WSAEventSelect模型
比较复杂的,
重叠模型
完成端口模型这些模型多多少少都要比阻塞模型复杂,但是也能带来更好的性能具体楼主最好是买本书了,里面的东西很多的^_^
(不是不想买书,现在实在没机会 & 条件,以后肯定要买的)还有啊,socket是POSIX兼容标准的,不要用WSA*系列。
另外指出小猪的错误:select模型跟阻塞非阻塞无关。
非阻塞的意义在于调用send,recv的时候会立即返回,而不去管数据是不是处理完了。
int CTcp::recv(int sd, char *buf, int len, int timeout)
{
int len1, len_recv;
time_t t2, t1; len_recv =0;
time(&t1);
t2 =t1; int err =0;
int counter=0;
while(len_recv <len)
{
if(t2 -t1 >timeout)
{
WSASetLastError(err);
return len_recv;
}
if(status(sd, "r", timeout-(t2-t1)) <0)
{
err =WSAGetLastError();
//WriteStat("tcp_status err=%d", WSAGetLastError());
WSASetLastError(err);
return len_recv;
} if((len1 =::recv(sd, &buf[len_recv], len-len_recv, 0)) <=0)
{
err =WSAGetLastError();
//WriteStat("recv err=%d, len1=%d", err, len1);
if(timeout ==0) break;
if(len1 ==SOCKET_ERROR && err ==WSAEWOULDBLOCK)
{
time(&t2); if(counter++>100)
{
Sleep(100);
counter=0;
} continue;
}
WSASetLastError(err);
return len_recv;
}
len_recv +=len1;
time(&t2);
}
WSASetLastError(err);
return len_recv;
}