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

2 つの明らかな間違い:

  • の使用recv():

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

2 番目の引数には受信データが入力されるため、変更可能 (文字列リテラルの変更は未定義の動作です) であり、要求されたバイトを格納するのに十分な大きさである必要があります。

    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 に答える