客户端启动后,连续发送三条信息,读取初始化信息,
经过调试服务端三条消息都能收到,且每收到一条,能成功发给客户端对应的初始化信息。但是服务端发给客户端的第三条信息虽然成功了(send()的返回值不为-1),但是客户端却收不到。我做了下面的调整,在客户端发完第二条信息后,弹出一个模态对话端,
点击确定,程序继续运行,服务端发给客户端的第三条信息也能成功收到,
请问到底出了什么问题?有人知道吗

解决方案 »

  1.   

    发送和接收并不是一一对应的,即发送三次,对方并不一定要接收3次,发送和接收数据的过程是协议来完成的,说一定你send三次数据,到最后是协议一次性将数据都发送出去的
      

  2.   

    现在我想完成下面的;
    先客户端发送字符“1111”,服务端收到后发送字符串“wang”到客户端,
    然后客户端发送字符“2222”,服务端收到后发送字符串"li"到客户端。根据楼上说的客户端的协议可能一次性发送了“11112222”到服务端,
    而服务端的接收函数为,recv(socket,buf,4),一次接收到四个字符,
    就受到了1111,就会向客户端发送"wang",当然服务端不会向客户端发送“1i”.请问LS,要怎么做才能解决上面的问题?达到预期的效果。
    我举的是个简单的例子,希望能给个比较通用的方法。
    在这先谢谢了
      

  3.   

    把收到的东西存到队列中,只要队列不为空,就说明还有消息没有处理完
    比如队列中位11112222,则先取出来1111,然后回复wang,之后看到队列中还有东西,取出来一看,是2222,则再回一个li
      

  4.   

    服务端用recv(socket,buf,4),接收到4个字节的数据,而发送过来“11112222”,会不会导致后面的“2222”数据丢失?如果是,那么就该扩大4为8,但是客户端也可能一次发送"111122223333",过来,又会导致“3333”丢失,
    就是说,服务端不知道客户端一次最大发送多少个字节过来的话,recv(socket,buf,4)中,的缓冲区大小就不好确定。
    客户端一次最大发送的字节数有定值吗?服务端接收时分配多少字节的缓冲区合适呢?
    我认为服务端接收时分配的字节数应该和客户端一次发送的最大字节数相等,防止有数据丢失。
    但客户端一次发送的最大字节数为多少呢?
      

  5.   

    控制服务器端每次接收4个字节的数据,有可能在接收的时候客户端发送的数据都到达了服务器的接收缓冲区内,这时就需控制
    简单的控制代码如下:switch(WSAGETSELECTEVENT(lParam))
        {
        case FD_ACCEPT:
            AcceptClient(s, this->m_hWnd);
            break;

        case FD_READ:
         if(SOCKET_ERROR==WSAAsyncSelect(s, this->m_hWnd, WM_MYSOCKMSG, 0))//取消FD_READ|FD_WRITE|FD_CLOSE网络消息通知
    {
    break;

    nRecv1=GetString(s, revbuf,PACKETlEN_FIELD_VALUE);//先接收前4个字节
                      if(nRecv1)
    {
                        if(SOCKET_ERROR==WSAAsyncSelect(s, this->m_hWnd, WM_MYSOCKMSG, FD_READ|FD_WRITE|FD_CLOSE)) //继续关联FD_READ|FD_WRITE|FD_CLOSE网络消息通知
    {
    break;

    }
    也可以定义包协议,包含包头和数据部分,服务器端每次接收包头数据,根据包头得到包的数据长度,再接收数据部分
      

  6.   

    现在的问题是客户端连续调用了两次send()函数,发送了两个协议包到服务端。
    服务端接收时两个个包都到达了,触发FD_READ消息。消息响应函数中,
    服务端读取了第一个包的包头,知道了下面要读取的字节数,接收读取指定的字节数。
    但是服务端不知道还有第二个数据包要读,要怎么读取第二个数据包呢?
      

  7.   

    每次进行读的时候进行7楼中的代码控制,只要服务器端的接收缓冲区有数据,服务器端会继续触发FD_READ消息