本人在网上看了好多有关设置socket操作为非阻塞相关的问与答,设置socket为非阻塞的有select、ioctlsocket等,我试了好多也没有成功。希望高手指点并给出实例。也有些人说CSocket不用在多线程中,可以也没有说明理由。也希望高手们多共享的更全面一些。多谢!
解决方案 »
- 求助:怎么将一根直管生成螺旋管(弹簧)的问题
- CWnd创建窗口的问题,坐等解决谢谢。
- 请教VC问题
- 请教如何读写硬盘扇区?
- 取控件容器在bcb6中不成功
- 爽哦!刚发现一个免费电影站,只要免费注册一下就可以看!速度超快,清晰度高,最新大片竟然都有。
- 我增加了一个类myTreeView,从CTreeView继承,但是报错:CTreeView没有base Class?
- 100分~刚学VC不久~,想找个比较有时间的人教我一下
- 还是对于用CFindReplaceDialog的疑惑,在线等待~~
- VC大侠,《Essenital C++》
- sheetWindow 是什么函数,谁知道??
- CGridCtrl问题
{
strcpy(m_szIp, szIp);
m_nPort = nPort; struct in_addr ip_addr;
unsigned long lIp = inet_addr(szIp);
ip_addr.S_un.S_addr = lIp;
struct sockaddr_in destaddr;
memset((void *)&destaddr,0,sizeof(destaddr));
destaddr.sin_family = AF_INET;
destaddr.sin_port = htons(nPort);
destaddr.sin_addr = ip_addr;
unsigned long ul = 1;
int ret = ioctlsocket(m_sck, FIONBIO, &ul); //设置为非阻塞模式
if(ret == SOCKET_ERROR)
return false; int error = -1, len;
len = sizeof(int);
timeval tm;
fd_set set;
bool bret = false;
if(connect(m_sck,(struct sockaddr*)&destaddr,sizeof(destaddr)) == -1)
{
tm.tv_sec = 8;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(m_sck, &set);
if(select(m_sck + 1, NULL, &set, NULL, &tm) > 0)
bret = true;
else
bret = false;
}
else
bret = true; if(!bret)
return false ;//表示连接不上服务器 unsigned long ul1= 0 ;
ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul1);//再设置为阻塞模式
if(ret == SOCKET_ERROR)
return false;//错误
m_bConnected = true;
return true;
}
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
TimeOut=3000;//设置接收超时3秒
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}