1

クライアントからサーバーに構造を送信しようとしています。構造体をchar配列に型キャストする必要があることをインターネットで読みましたが、これを試してみると、charにはコンテンツがありません。

ここに私の構造体があります:

struct packet
{
    int pa_ID;
    char message[MESSAGESIZE];
};

そして、ここで構造体を送信しようとします:

int sendFile(FILE *file, SOCKET sock)
{
int amountToSend, amountSent;
int i = 0;
char buffer[BUFFERSIZE], serializedPacket[BUFFERSIZE];

while (!feof(file)) {
    struct packet p;
    fgets(p.message, MESSAGESIZE, file);
    p.pa_ID = i;

    if (p.message[strlen(p.message) - 1] == '\n')
        p.message[strlen(p.message) - 1] = '\0';

    amountToSend = sprintf_s(serializedPacket, sizeof(buffer), (char*)&p);
    amountSent = send(sock, serializedPacket, amountToSend, 0);
    if (amountSent == SOCKET_ERROR) {
        fprintf(stderr, "send() failed with error %d\n", WSAGetLastError());
        getchar();
        WSACleanup();
        return -1;
    }
    printf("Send %d bytes (out of %d bytes) of data: [%.*s]\n", amountSent, amountToSend, amountToSend, serializedPacket);
    memset(buffer, 0, sizeof(buffer));
    memset(p.message, 0, sizeof(p.message));
    memset(&p, 0, sizeof(p));
    i++;
}

fclose(file);
return 0;

}

ファイルからの読み取りはエラーなしで機能しますが、serializedPack は単に空であり、その理由がわかりません。誰かが助けてくれることを願っています。

4

1 に答える 1

4

これ:

amountToSend = sprintf_s(serializedPacket, sizeof(buffer), (char*)&p);

まったく意味がありません。

の 3 番目の引数sprintf_s()は書式設定文字列ですが、文字ポインターとして再キャストされた構造体へのポインターを渡します。これはまったく意味がありません。

構造をテキスト文字列として表現する (文字列にシリアル化する) のは良い考えかもしれませんが、適切なフォーマット文字列が必要です:

amountToSend = sprintf_s(serializedPacket, sizeof(buffer), "%d %s", p.pa_ID, p.message);

これを送信する方法によっては、送信データに文字列の 0 ターミネータを含めることもできます。

于 2013-01-24T09:29:32.527 に答える