【问题标题】:sending structure with winsock用winsock发送结构
【发布时间】:2013-01-07 23:54:47
【问题描述】:

我尝试将结构从客户端发送到服务器。我在互联网上读到我必须将结构类型转换为 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 只是空的,我真的不明白为什么。 希望有人能帮忙。

【问题讨论】:

    标签: c struct client-server winsock


    【解决方案1】:

    这个:

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

    没有任何意义。

    sprintf_s() 的第三个参数是一个格式化字符串,但是你传递一个指向结构的指针,重新转换为字符指针。这完全没有意义。

    将您的结构表示为文本字符串(序列化为字符串)可能是个好主意,但是您需要一个正确的格式化字符串:

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

    根据您发送此信息的方式,您可能还希望在传输的数据中包含字符串的 0 终止符。

    【讨论】:

    • 一般来说,我建议定义一个协议(例如 ASCII 或二进制)来定义你的消息应该是什么样子......如果你创建一个二进制协议,你甚至不需要 sprintf 你的有效载荷
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多