在C语言中通过套接字编写不同类型的消息

在C语言中通过套接字编写不同类型的消息,c,sockets,C,Sockets,我想通过C语言中的TCP套接字连接向绑定类发送消息。我必须使用write()方法通过此连接传入请求类型(char*)、ip地址(int)、argTypes(int数组)等。在一条消息中发送所有信息的最佳方法是什么 不能保证您可以在一次读/写操作中发送/接收所有数据; 太多的因素可能会影响质量/数据包大小/连接稳定性等。 这个 一些。 一个很好的解释。 A 关于发送不同类型的消息: 您发送的数据来自您的服务器应用程序,然后由您的客户端应用程序接收,客户端应用程序可以以任何方式解释这些数据 如果您的

我想通过C语言中的TCP套接字连接向绑定类发送消息。我必须使用write()方法通过此连接传入请求类型(char*)、ip地址(int)、argTypes(int数组)等。在一条消息中发送所有信息的最佳方法是什么

不能保证您可以在一次读/写操作中发送/接收所有数据; 太多的因素可能会影响质量/数据包大小/连接稳定性等。
这个

一些。
一个很好的解释。
A

关于发送不同类型的消息:

您发送的数据来自您的服务器应用程序,然后由您的客户端应用程序接收,客户端应用程序可以以任何方式解释这些数据

如果您的数据是相关的,您可以在单独的头中创建一个结构,并在客户端和服务器代码中使用它,然后跨客户端发送此结构的变量。如果它不相关,那么我不确定您为什么需要将它们作为一条消息发送出去。

如果您想通过一次写入和一次读取来发送和接收数据,那么您必须使用数据报套接字。由于数据报套接字是无连接的,因此不能使用
写入
/
读取
。相反,您可以使用
sendto
/
recvfrom
sendmsg
/
recvmsg
。因为数据报套接字是不可靠的,所以您必须实现自己的协议来容忍无序的数据传递和数据丢失

如果您不想处理数据报套接字的不可靠性质,那么您需要流套接字。由于连接了流套接字,因此传输的数据得到了保证并且是有序的。如果您发送的数据总是具有相同的大小,那么您可以通过对
send
调用使用阻塞模式,然后在
recv
调用中传入
MSG_WAITALL
来模拟数据报

#define MY_MSG_SIZE 9876

int my_msg_send (int sock, const void *msg) {
    int r, sent = 0;
    do {
        r = send(sock, (const char *)msg + sent, MY_MSG_SIZE - sent,
                 MSG_NOSIGNAL);
        if (r <= 0) {
            if (r < 0 && errno == EINTR) continue;
            break;
        }
        sent += r;
    } while (sent < MY_MSG_SIZE);
    if (sent) return sent;
    return r;
}

int my_msg_recv (int sock, void *msg) {
    int r, rcvd = 0;
    do {
        r = recv(sock, (char *)msg + rcvd, MY_MSG_SIZE - rcvd, MSG_WAITALL);
        if (r <= 0) {
            if (r < 0 && errno == EINTR) continue;
            break;
        }
        rcvd += r;
    while (rcvd < MY_MSG_SIZE);
    if (rcvd) return rcvd;
    return r;
}
然后您可以这样表示
struct my_data
的一个实例:

NAME_LEN : 4 bytes
NAME : NAME_LEN bytes
ADDRESS : 4 bytes
TYPES_LEN : 4 bytes
TYPES : TYPES_LEN * 4 bytes
NAME\u LEN
将从
strlen(msg->NAME)
获取,而
TYPES\u LEN
将从
msg->number\u TYPES
获取其值。当您发送消息时,前面会有上述消息的总长度


我们一直使用32位量来表示长度,这可能足以满足您的需要。通过套接字传输数字时,发送方和接收方必须就数字的字节顺序达成一致。也就是说,数字1是表示为
0.0.0.1
还是表示为
1.0.0
。这通常可以使用网络字节排序来处理,网络字节排序使用前者。套接字头文件提供宏
htonl
,该宏将32位值从主机的本机字节顺序转换为网络字节顺序。这是在存储值时使用的,例如
NAME\u LEN
。接收器将使用相应的宏
ntohl
将传输的值恢复到主机使用的表示形式。如果主机的本机字节顺序已经与网络字节顺序匹配,则宏当然可以是no-ops。在异构环境中发送和接收数据时,使用这些宏尤其重要,因为发送方和接收方可能有不同的主机字节顺序。

您尝试了什么,失败的原因是什么?请同时输入链接中的内容。如果这些链接消失了,这将有助于未来的读者。@master:我不知道:这些链接上的内容可能是受版权保护的?(互联网档案可能会有所帮助——他们如何处理受版权保护的材料?)无论如何,我不认为鲁莽地复制别人的内容会有好结果。我的意思是,答案应该是自足的;不一定是全部内容。现在无法链接,但是在Meta上有很多关于它的帖子。@strustmaster:这个Meta链接:和这个:似乎涵盖了这个问题。
NAME_LEN : 4 bytes
NAME : NAME_LEN bytes
ADDRESS : 4 bytes
TYPES_LEN : 4 bytes
TYPES : TYPES_LEN * 4 bytes