贴出服务器端代码如下,客户端也是用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;
}
}
}
}
现在的问题是:一端发送了,另一端马上收不到,需要也回复一下才可以收到。而且一端连续发送好几条之后,另外一端是回复一条,收到一条。
大牛给看看啊,刚刚弄这个的
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;
}
}
}
}
解决方案 »
- 关于STL的问题,vector<hash_map<string, string>>
- vc 6.0 开发客户端,数据库并发操作该怎么处理比较好
- 模式窗体隐藏后如何再显示出来??
- 【编程挑战】 能否在 ListCtrl 的每一行的第一列同时显示多个图标?
- 老大让写一个ActiveX控件,用于控制打印机,给点建议吧!
- 请教VISTA及以上系统如何判断一个文件的最大图标是48×48还是256×256?
- 怎么进行超联接?
- 我已经用HOOK截获wsock32.dll的recv(),但截来的有用的数据都是一堆堆的数据包,如何分析这些数据包呢?
- 怎样用CListView实现资源管理器右半部分的文件夹图表显示功能!
- 用MFC建立文档时一定看懂全部程序吗?
- javascript响应activex的事件,怎么传递数组
- createFile创建文件后异步没有写入字符串?
这句话阻塞了吧,你不输入程序就不会往下运行了
这个问题,但是我是要输入的啊
怎么解决一下呢
select可能返回的是多个可读可写,用个while循环处理完。
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操作的套接字句柄。