0

//这是服务器端代码,我在连接到服务器后使用onReceive

//void CMFCExampleDlg::OnReceive(int nErrorCode)
{   
  recv(clientsocket,"200" , 1024, 0);
  m_name.SetVariable("gear","1");
}

//////客户端

//BOOL CMFCClientDlg::PreTranslateMessage(MSG* pMsg)
{
  if(pMsg->lParam==VK_NUMLOCK)
    send(s,"200",1024,0);

  return 0;
}
4

1 回答 1

5

两个明显的错误:

  • 用途recv()

    recv(clientsocket,"200" , 1024, 0);
    

第二个参数填充了传入数据,因此必须是可修改的(修改字符串文字是未定义的行为)并且足够大以存储请求的字节:

    char buffer[1024] = ""; /* recv() does not null terminate. */
    int bytes_read = recv(clientsocket, buffer , 1024, 0);

    if (SOCKET_ERROR == bytes_read)
    {
        /* Failure. */
    }
    else
    {
        /* SOME bytes were read. */
    }
  • 该代码在撒谎,send()因为没有1024要发送的数据字节:

    send(s,"200",1024,0);
    

这将导致未定义的行为,因为send()访问超出了"200"存储字符串文字的数组的边界:

    int bytes_sent = send(s, "200", 3, 0);
    if (3 != bytes_sent)
    {
        /* Failed to send all data. */
    }

重要的是要记住,从套接字写入和读取数据只是一个字节流,没有消息的逻辑概念:您必须通过某种应用程序定义的协议来实现它。例如:

  • 在每条消息前面加上其长度(以字节为单位),后跟消息内容,或
  • 用换行符结束每条消息

recv()并且send()通常在循环中使用,直到读取所有数据、发送所有数据或发生不可恢复的故障。

于 2013-05-08T10:59:03.560 回答