贴出服务器端代码如下,客户端也是用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;
}
}
}
                }

解决方案 »

  1.   

    我自己先顶一下我的是用vc做的,网上看了有linux的解决方法,win下怎么弄啊?
      

  2.   

    gets(sendBuf);
    这句话阻塞了吧,你不输入程序就不会往下运行了
      

  3.   

    select可能返回的是多个可读可写,用个while循环处理完。
      

  4.   

    好像是gets(sendBuf);
    这个问题,但是我是要输入的啊
    怎么解决一下呢
      

  5.   

    gets(sendBuf);堵住了
    select可能返回的是多个可读可写,用个while循环处理完。
      

  6.   

    套接字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操作的套接字句柄。
      

  7.   

    可以读很好理解,有了数据才好读。我想一般来说,建立好了连接,如果没别的事就是可以写的了。。我曾经调试过。我想应该看你的业务需求,适时放到可写的SET。