select如何判断可读可写的啊?

pochuanpiao 2010-04-22 10:01:46
贴出服务器端代码如下,客户端也是用select这么做的
现在的问题是:一端发送了,另一端马上收不到,需要也回复一下才可以收到。而且一端连续发送好几条之后,另外一端是回复一条,收到一条。
大牛给看看啊,刚刚弄这个的
sockConn = accept(sockSer,(SOCKADDR*)&addrClient,&len);

while(1)
{
struct timeval timeout;
fd_set r; //定义一个读集合
fd_set w; //写

FD_ZERO(&r); //
FD_ZERO(&w);
FD_SET(sockConn,&r); //
FD_SET(sockConn,&w);
timeout.tv_sec = 1;
timeout.tv_usec =0;

switch(select( 0 , &r , &w , 0, &timeout))
{
case SOCKET_ERROR:
break;
case 0:
break;
default:
if(FD_ISSET( sockConn , &r ))
{
memset(recvBuf,0,100);
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
if('Q' == recvBuf[0] || 'q' ==recvBuf[0])
{
send(sockConn,"Quit",strlen("Quit")+1,0);
printf("Chat end!\n");
break;
}
}

if(FD_ISSET( sockConn , &w ))
{
printf("server %s say:",inet_ntoa(addrSer.sin_addr));

memset(sendBuf,0,100);
gets(sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

if('Q' == sendBuf[0] || 'q' ==sendBuf[0])
{
printf("Chat end!\n");
break;
}
}
}
}
...全文
1272 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ytdolly 2013-01-06
  • 打赏
  • 举报
回复
连接建立好后(因为跟对方已经沟通好可以连接了),就可以写了。 当有数据来了的时候,就是可读;这样理解吧?
尹成 2010-04-22
  • 打赏
  • 举报
回复
gets(sendBuf);堵住了
select可能返回的是多个可读可写,用个while循环处理完。
Eleven 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 conry 的回复:]
gets(sendBuf);
这句话阻塞了吧,你不输入程序就不会往下运行了
[/Quote]
解释的很清楚了
ljz888666555 2010-04-22
  • 打赏
  • 举报
回复
你这是控制台程序,如果是对话框的话,可以用另开一个线程用于数据发送。
pochuanpiao 2010-04-22
  • 打赏
  • 举报
回复
好像是gets(sendBuf);
这个问题,但是我是要输入的啊
怎么解决一下呢
zyq5945 2010-04-22
  • 打赏
  • 举报
回复
select可能返回的是多个可读可写,用个while循环处理完。
Conry 2010-04-22
  • 打赏
  • 举报
回复
gets(sendBuf);
这句话阻塞了吧,你不输入程序就不会往下运行了
pochuanpiao 2010-04-22
  • 打赏
  • 举报
回复
我自己先顶一下

我的是用vc做的,网上看了有linux的解决方法,win下怎么弄啊?
dongbeihudaye 2010-04-22
  • 打赏
  • 举报
回复
可以读很好理解,有了数据才好读。我想一般来说,建立好了连接,如果没别的事就是可以写的了。。我曾经调试过。我想应该看你的业务需求,适时放到可写的SET。
TZHCC 2010-04-22
  • 打赏
  • 举报
回复
看看,等高手
Snovate 2010-04-22
  • 打赏
  • 举报
回复
套接字I/O模型:让winsock对I/O进行管理,主要用与同时管理一个或多个套接字模型
Select模型:避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。
Select函数:用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。
设计select的目的:防止应用程序在套接字处于锁定模式时,在一次I/O绑定调用(如期send/recv)中,被迫进入锁定状态,同时防止套接字处于非锁定模式中时,产生WSAEWOULDBLOCK错误。除非满足事先参数定义的条件,否则select会在进行I/O操作时锁定
Int select(int nfds. //可忽略保证与早期版本兼容
Fd_set FAR* readfds, //用于检查可读性
Fd_set FAR* writefds, //检查可写性
Fd_set FAR* exceptfds, //用于例外数据
Const struct timeval FAR* timeout)
中间三个参数任意两个都可以为空,但至不有一个不能为空,在不为空的的集合中要包含至少一个套接字句柄,否则select便没有任何东西可以等待。最后一个timeval结构用于设定select最多等待I/O操作多久的时间,若timeval为NULL则select会无限期锁定或停顿下去。直到至少有一个描述符符合指定条件后结束。
Struct timeval { long tv_sec; //以秒为单位
long tv_usec; //以毫秒为单位
}
Select 成功完成后:会在fd_set结构中,返回刚好在末完成有I/O操作的所有套接字句柄的总量
用select对套接字进行侦视之前必须设置好fd_set结构,然后再调用select,winsock提供下列宏来针对I/O活动,对fd_set进行处理与检查:
FD_CLR(s , *set):从set中删除套接字
FD_ISSET(s , *set):检查S是否set集合中的一名成员,若是则返回TRUE
FD_SET(s , *set ):将套接字S加入集合set中
FD_ZERO( *set):将set初始化为空集合
Select:返回后会修改每一个fd_set结构,删除那些不存在待决I/O操作的套接字句柄。

18,356

社区成员

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

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