非阻塞模式的TCP连接怎么实现呢?(100分)

jbz001 2011-09-12 09:45:41
非阻塞模式的TCP连接怎么实现呢?
我这已经实现了非阻塞模式的UDP连接,但是TCP连接不知道怎么做。
...全文
815 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxcong 2011-09-14
  • 打赏
  • 举报
回复
打开MFC文件夹,看CAsyncSocket的源码
然后,再去codeproject上找找
CCliveHunter 2011-09-14
  • 打赏
  • 举报
回复
Select模型 或者 完成端口模型 王艳平的《网络与通信程序设计》一书中有详细的讲解
successgl 2011-09-14
  • 打赏
  • 举报
回复
阻塞非阻塞指的是socket啊,与tcp,udp协议没啥关系啊,楼主的问题是不是没有这么简单啊?
blueapples0604 2011-09-14
  • 打赏
  • 举报
回复
利用SELECT监视端口数据就可以
fd_set fds;
timeval timeout={3,0}; //select等待3秒
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(m_CSocket,&fds); //添加描述符
int sel=select(m_CSocket+1,&fds,NULL,NULL,&timeout);
在等待的timeout时间内,若端口有数据,则select函数会返回,通过判断sel的值,就知道端口是否有数据,或者是超时了。
hurryboylqs 2011-09-13
  • 打赏
  • 举报
回复
UDP连接都会弄 TCP不会不是搞笑么
zhd320 2011-09-13
  • 打赏
  • 举报
回复
http://guojun0681.blog.163.com/blog/static/10051312010113113140952/
http://hi.baidu.com/%D1%EE%D4%C6%B7%C9%B5%C4%BF%D5%BC%E4/blog/item/eb5e8439daf9d9e5b211c7b1.html
或许有用
smwhotjay 2011-09-13
  • 打赏
  • 举报
回复
搞笑..

非阻塞tcp. 可以WSASynSelect 关注FD_CONNECT ,然后connect.等待FD_CONNECT事件就行了. WSAEventSelect一样的.

IOCP的acceptEx比较麻烦..
lijianli9 2011-09-13
  • 打赏
  • 举报
回复
WSADATA wsd;
SOCKET cClient;
int ret;
struct sockaddr_in server;
hostent *host=NULL;

if(WSAStartup(MAKEWORD(2,0),&wsd)){return 0;}
cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(cClient==INVALID_SOCKET){return 0;}
//set Recv and Send time out
int TimeOut=6000; //ÉèÖ÷¢Ëͳ¬Ê±6Ãë
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
TimeOut=6000;//ÉèÖýÓÊÕ³¬Ê±6Ãë
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
//ÉèÖ÷Ç×èÈû·½Ê½Á¬½Ó
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;

//Á¬½Ó
server.sin_family = AF_INET;
server.sin_port = htons(25);
server.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);
if(server.sin_addr.s_addr == INADDR_NONE){return 0;}

connect(cClient,(const struct sockaddr *)&server,sizeof(server));

//select Ä£ÐÍ£¬¼´ÉèÖó¬Ê±
struct timeval timeout ;
fd_set r;

FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //Á¬½Ó³¬Ê±15Ãë
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(cClient);
return 0;
}
//Ò»°ã·ÇËø¶¨Ä£Ê½Ì׽ӱȽÏÄÑ¿ØÖÆ£¬¿ÉÒÔ¸ù¾Ýʵ¼ÊÇé¿ö¿¼ÂÇ ÔÙÉè»Ø×èÈûģʽ
unsigned long ul1= 0 ;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR){
::closesocket (cClient);
return 0;
v_table 2011-09-13
  • 打赏
  • 举报
回复
异步模型好多,看实际情况用哪个。。
shenyi0106 2011-09-13
  • 打赏
  • 举报
回复
简单应用可以用CAsyncSocket
龙行天下之Sky 2011-09-13
  • 打赏
  • 举报
回复
int iMode = 0; //0表示阻塞,1表示非阻塞
ioctlsocket(m_socket,FIONBIO, (u_long FAR*) &iMode);
要自己设置的,函数就是ioctsocket
yynetsdk 2011-09-13
  • 打赏
  • 举报
回复
bsd socket or CSocket , CAnsySocket

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧