Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 linux模块中通过UDP套接字发送带有指针字符的结构_Linux_Sockets_Module_Udp_Send - Fatal编程技术网

在c linux模块中通过UDP套接字发送带有指针字符的结构

在c linux模块中通过UDP套接字发送带有指针字符的结构,linux,sockets,module,udp,send,Linux,Sockets,Module,Udp,Send,我必须通过udp套接字在两台机器之间发送结构 我需要的信息是发送一个结构,如下所示: unsigned long x; unsigned long y; char *buf; 我必须一次性发送结构 我的问题是:我如何处理这个结构,例如,设置一个可以通过套接字发送的变量,特别是当变量buf的大小不固定时 感谢您的帮助您无法发送指针,在您的进程空间之外没有任何意义。相反,您必须序列化它,即复制到一个数组并发送该数组。在创建字符串之前,还需要存储其长度。您可以尝试: char sendbuf[.

我必须通过udp套接字在两台机器之间发送结构 我需要的信息是发送一个结构,如下所示:

unsigned long x;

unsigned long y;

char *buf;
我必须一次性发送结构

我的问题是:我如何处理这个结构,例如,设置一个可以通过套接字发送的变量,特别是当变量buf的大小不固定时


感谢您的帮助

您无法发送指针,在您的进程空间之外没有任何意义。相反,您必须序列化它,即复制到一个数组并发送该数组。在创建字符串之前,还需要存储其长度。您可以尝试:

char sendbuf[...];
int len = strlen(buf);

memcpy(sendbuf, &x, sizeof(x));
memcpy(sendbuf + sizeof(x), &y, sizeof(y));
memcpy(sendbuf + ..., &len, sizeof(len));

memcpy(sendbuf + ..., buf, len);

您不能发送指针,它在您的进程空间之外没有任何意义。相反,您必须序列化它,即复制到一个数组并发送该数组。在创建字符串之前,还需要存储其长度。您可以尝试:

char sendbuf[...];
int len = strlen(buf);

memcpy(sendbuf, &x, sizeof(x));
memcpy(sendbuf + sizeof(x), &y, sizeof(y));
memcpy(sendbuf + ..., &len, sizeof(len));

memcpy(sendbuf + ..., buf, len);

您需要将结构中的所有内容按顺序复制到单独的字符缓冲区中,然后将其写入套接字。另外,由于结构中的char*缓冲区不是固定长度的,因此通常最好计算要发送的内容的大小,并在消息开头将其作为整数写入,以便在另一端通过接收套接字验证要发送的数据包的长度

在另一端解包数据时,只需从接收缓冲区的开头开始,然后将memcpy数据转换为值

字符*消息;//这是指向项目开始的指针 //接收消息缓冲区

// TODO: assign message to point at start of your received buffer.


unsigned long xx;
unsigned long yy;
memcpy(&xx,message,sizeof(unsigned long));  // copy bytes of message to xx
message += sizeof(unsigned long);           // move pointer to where yy SHOULD BE 
                                            // within your packet    
memcpy(&yy,nessage,sizeof(unsigned long));  // copy bytes to yy
message += sizeof(unsigned long);           // message now points to start of 
                                            // the string part of your message

int iStringLength =   //  ?????? You need to calculate length of the string
char tempBuffer[1000]; // create a temp buffer this is just for illustration
                       // as 1000 may not be large enough - depends on how long
                       // the string is
memcpy(tempBuffer,message,iStringLength);
然后xx,yy包含长值,tempBuffer包含字符串。如果希望字符串持续存在于当前范围之外,则需要分配一些内存并将其复制到该范围。您可以根据整个消息的大小减去2个无符号长项目的大小来计算此字符串的大小(或者,如果您按照我上面的建议,则使用数据包中发送的额外项目)


我希望这澄清了您需要做什么

您需要将结构中的所有内容按顺序复制到单独的字符缓冲区中,然后将其写入套接字。另外,由于结构中的char*缓冲区不是固定长度的,因此通常最好计算要发送的内容的大小,并在消息开头将其作为整数写入,以便在另一端通过接收套接字验证要发送的数据包的长度

在另一端解包数据时,只需从接收缓冲区的开头开始,然后将memcpy数据转换为值

字符*消息;//这是指向项目开始的指针 //接收消息缓冲区

// TODO: assign message to point at start of your received buffer.


unsigned long xx;
unsigned long yy;
memcpy(&xx,message,sizeof(unsigned long));  // copy bytes of message to xx
message += sizeof(unsigned long);           // move pointer to where yy SHOULD BE 
                                            // within your packet    
memcpy(&yy,nessage,sizeof(unsigned long));  // copy bytes to yy
message += sizeof(unsigned long);           // message now points to start of 
                                            // the string part of your message

int iStringLength =   //  ?????? You need to calculate length of the string
char tempBuffer[1000]; // create a temp buffer this is just for illustration
                       // as 1000 may not be large enough - depends on how long
                       // the string is
memcpy(tempBuffer,message,iStringLength);
然后xx,yy包含长值,tempBuffer包含字符串。如果希望字符串持续存在于当前范围之外,则需要分配一些内存并将其复制到该范围。您可以根据整个消息的大小减去2个无符号长项目的大小来计算此字符串的大小(或者,如果您按照我上面的建议,则使用数据包中发送的额外项目)


我希望这能澄清您需要做什么

非常感谢您的回答,但是当服务器接收到sendbuf时,我如何才能获得原始数据x、y和buf的值。@user1503486使用
memcpy
镜像这些操作。非常感谢您的回答,但是当服务器接收到sendbuf时,如何获取原始数据x,y和buf的值..@user1503486使用
memcpy
来镜像这些操作。谢谢你的回答,你能给我举个例子吗谢谢你的回答,我会尝试告诉你,在测试了你给我的代码后,祝你愉快,我发现它在两个变量的情况下工作,但是第三种类型*char我无法恢复它,下面是代码:
memcpy(&offset,p,sizeof(unsigned long))
p+=sizeof(无符号长)
memcpy(&nbytes,p,sizeof(unsigned long))
p+=sizeof(无符号长)然后如果我打印p,它会给出一个垃圾,我不知道为什么,也许udp会在发送时向套接字添加一些东西??提前感谢您的支持help@user1503486我又加了一些。如果你不明白从这里该做什么,恐怕我再也帮不了你了。我不能为你写完整的代码。如果这还不够,那么我建议你买一本好书,或者其他人会为你提供逐行代码。我想这里的两个答案都提供了足够的信息让你能够解决你的问题。非常感谢,它终于起作用了,谢谢你帮助我……我很抱歉给你带来不便,我可能不太熟悉C谢谢你的回答,你能给我举个例子吗谢谢你的回答,我会试着告诉你,在测试了你给我的代码之后,祝你过得愉快,我发现它在两个变量的情况下工作,但是第三个变量类型*char我无法恢复它,下面是代码:
memcpy(&offset,p,sizeof(unsigned long))
p+=sizeof(无符号长)
memcpy(&nbytes,p,sizeof(unsigned long))
p+=sizeof(无符号长)然后如果我打印p,它会给出一个垃圾,我不知道为什么,也许udp会在发送时向套接字添加一些东西??提前感谢您的支持help@user1503486我又加了一些。如果你不明白从这里该做什么,恐怕我再也帮不了你了。我不能为你写完整的代码。如果这还不够,那么我建议你买一本好书,或者其他人会为你提供逐行代码。我认为这里的两个答案都为您提供了足够的信息,使您能够解决您的问题。非常感谢,它终于起作用了,谢谢您帮助我…对于给您带来的不便,我深表歉意,我可能不太熟悉c