Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C/C+中创建和发送数据包+; < P> >我想用C或C++将以下数据发送到套接字,一个包: Headers ------- Field 1: 2 byte hex Field 2: 2 byte hex Field 3: 4 byte hex Data ---- Field1 : 2 byte hex Field1 : 8 byte hex_C++_C_Sockets - Fatal编程技术网

在C/C+中创建和发送数据包+; < P> >我想用C或C++将以下数据发送到套接字,一个包: Headers ------- Field 1: 2 byte hex Field 2: 2 byte hex Field 3: 4 byte hex Data ---- Field1 : 2 byte hex Field1 : 8 byte hex

在C/C+中创建和发送数据包+; < P> >我想用C或C++将以下数据发送到套接字,一个包: Headers ------- Field 1: 2 byte hex Field 2: 2 byte hex Field 3: 4 byte hex Data ---- Field1 : 2 byte hex Field1 : 8 byte hex,c++,c,sockets,C++,C,Sockets,创建和发送包含所有这些数据的数据包时,代码通常是什么样子的?根据操作系统的网络库(*nix使用、Windows使用等),代码看起来会有所不同。但是,您可以创建一个包含要在数据包中发送的所有数据的结构,例如 typedef struct { short field1; short field2; int field3; } HeaderStruct; typedef struct { short field1; long long field2; } Pa

创建和发送包含所有这些数据的数据包时,代码通常是什么样子的?

根据操作系统的网络库(*nix使用、Windows使用等),代码看起来会有所不同。但是,您可以创建一个包含要在数据包中发送的所有数据的结构,例如

typedef struct
{
    short field1;
    short field2;
    int field3;
} HeaderStruct;

typedef struct
{
    short field1;
    long long field2;
} PacketDataStruct;
假设为32位整数大小

编辑:


正如有人在评论中善意地提醒我的那样,不要忘记转换成和转换成。网络库将具有帮助实现这一点的功能,例如
ntohs
nothl
htons
,和
htonl
,一个简单的答案是,它将以接收者期望的格式发送。不过,这有点回避了这个问题。假设数据是如图所示的固定大小,并且接收端希望这样,那么您可以使用压缩(1字节对齐)结构并将数据存储在每个字段中。使用1字节对齐的原因是,通常更容易确保两端需要相同的数据。如果没有1字节对齐,那么根据编译器选项、32位与64位体系结构等,结构可能看起来会有所不同),并且通常,如果十六进制值是整数,则希望以网络字节顺序发送值。您可以使用诸如
htons
htonl
等函数(如果可用,还可以使用
htobe64
)对其进行转换

假设数据位于具有所需字节顺序的结构中,则发送调用可能如下所示:

ret = send( socket, &mystruct, sizeof( mystruct ), 0 );

这假设
mystruct
被声明为结构的实例,而不是指向结构的指针。

通常,它看起来像是在将数据包结构准备到内存缓冲区中(明智地调用
htonl
函数族)

然后,If将使用
send
sendto
sendmsg
write
功能,希望对缓冲区的长度和良好的错误处理/报告非常小心

(或发送的Win32 API之一,如果是目标平台。)

你会在网站上找到一个关于这一切的很好的介绍


特别是字节打包部分(考虑到endian),请看主题。(该部分的详细信息远远超过了普通固定大小整数数据类型所需的信息。

假设您的程序已组织为在一个
struct
中包含头,在另一个
struct
中包含数据。例如,您可能具有以下数据结构:

#include <stdint.h>
struct header {
    uint16_t f1;
    uint16_t f2;
    uint32_t f3;
};
struct data {
    uint16_t pf1;
    uint64_t pf2;
};
要发送数据,请执行以下操作:

...
char buffer[18];
htonHeaderData(myPacketHeader, myPacketData, buffer);
send(sockfd, buffer, 18, 0);
...
同样,您不必使用我定义的
数据
结构。只需使用您的程序所需的任何东西。关键是您有一个转换函数,它以定义良好的偏移量,以定义良好的字节顺序将所有数据写入缓冲区,并将该缓冲区传递给send()函数


在网络连接的另一端,您需要一个程序来解释它接收到的数据。在这一端,您需要编写相应的函数(
ntohHeader
等)。这些函数将
memcpy
从缓冲区中取出位,然后放入一个局部变量,它可以传递给
ntohs
ntohl
。我将把这些函数留给您编写。

这是我一直在想的。发送打包的数据是什么样子的?您能用它更新答案吗?确保您有这些strUCT包装正确,您可以处理任何endian ness问题!我假设send()是方法将缓冲区变量作为参数,对吗?能否提供一个将数据包结构准备到内存缓冲区的示例?这两个链接都是broken@Mat是的,我很容易找到它,但如果我发现断开的链接,我倾向于留下评论:)相关的外部链接:如果C++我建议寻找一个优秀的跨平台网络库。你能扩展一下你所说的“一分为二”吗?您是指链路层数据包(以太网、PPP等)?或者你是说别的什么?@Rob,我不想多次调用send()来发送标题和数据。我想使用一个send()调用将标题和数据一起发送。除非这不是通常的做法?这是一个很好的要求,@Chad。只是“packet”在不同的上下文中意味着不同的东西,我想确保你不是在谈论别的东西。我见过程序在一个
send
、两个
send
s和两个以上
send
s中发送标题和数据。这里没有“正常”,只是代码中对组织方便的内容。现在让我们假设我想发送多个数据包,就像slavik262向我们展示的那样。然后,我是否只需要一个包含子结构的结构,并将其传递给send()?@Chad:您可以多次调用send()(请注意,您应该检查返回代码)。如果您使用的是TCP,并且正在使用Nagle的算法,那么即使多次调用send,数据也可能作为单个数据包在网络上传输。不过,如果您使用的是UDP,则每个发送调用都会产生单独的数据包。如果是这样的话,那么如果您希望在一个数据包中发送它(这不是一个要求),那么您可能希望将它全部复制到一个缓冲区。字段对齐(和排序)不是因编译器和机器而异吗?你还必须处理endianness。这使得结构成为一个错误的选择,除非一个与同一程序的同一版本的另一个实例进行通信。@ikegami:我在答案(htonl等)中讨论了这一点,这正是我想要的。非常感谢你!问题1:为什么“d.pf2>>32”?问题2:“d.pfd2”是什么?回答2:
d.pfd2
...
char buffer[18];
htonHeaderData(myPacketHeader, myPacketData, buffer);
send(sockfd, buffer, 18, 0);
...