0

以下に示すように、strcmpを使用しています。

私は値をデバッグしていますが、同じものになっていますが、まだその条件が真になっていません。

const char opcode_read[2] = {'0', '1'};

rc = recvfrom(s, blk_receive_full, sizeof (blk_receive_full), 0,(struct sockaddr FAR *)&sin, &fromlength);

if(rc == -1){
    printf("failed: recvfrom, \n No data received \n failed code: %d\n",WSAGetLastError());
    cleanup();
    exit(1);
}

memcpy(blk_receive_opcode, &blk_receive_full, 2);
if (strcmp(blk_receive_opcode, opcode_data) == 0) {
}
4

3 に答える 3

3

opcode_readは文字列ではありません。NUL 終了はありません。そのサイズを 3 に変更して、3 番目の位置で NUL を取得します。

const char opcode_read[3] = {'0', '1'};

別の方法として、 strcmpの代わりにmemcmpを使用することで、厄介な NUL ターミネータについて心配する必要がなくなります。

recvfrom呼び出しも少し怖いです。TCPIP を正しく思い出せば。関数が 1 回の呼び出しで 2 バイトを返すという保証はありません。最初の呼び出しで 1 バイトを返し、2 番目の呼び出しで 2 番目のバイトを返す場合があります。

于 2009-10-06T02:08:04.827 に答える
3

memcmp代わり に試してみることをお勧めします。strcmpnull で終了する文字列用です。

于 2009-10-06T02:09:53.170 に答える
3

私が知る限り、2 つの文字列は null で終了していないため、比較していません。memcmp()代わりに次を使用することもできます。

if (memcmp(blk_receive_opcode, opcode_data, 2) == 0) {
}
于 2009-10-06T02:10:22.933 に答える