C 在写入api()中传递结构变量名

C 在写入api()中传递结构变量名,c,sockets,C,Sockets,接收和处理数据包时出现问题,因为我过去只发送一个缓冲区,而不是“saddr”及其“大小” 因此,我使用structure来声明所有成员,而不是write()api中的字段缓冲区,我需要发送struct变量名。我需要在那里使用指针吗 struct fields { unsigned char buffer[1024]; socklen_t saddr_size; } data; 首先,recvfrom返回消息的长度 n = recvfrom(sock,buffe

接收和处理数据包时出现问题,因为我过去只发送一个缓冲区,而不是“saddr”及其“大小” 因此,我使用structure来声明所有成员,而不是write()api中的字段缓冲区,我需要发送struct变量名。我需要在那里使用指针吗

 struct fields
 { 
     unsigned char buffer[1024];

     socklen_t saddr_size;
 } data; 

首先,
recvfrom
返回消息的长度

 n = recvfrom(sock,buffer,1024,0,(struct sockaddr *)&from, &length);       
 if (n < 0) error("recvfrom");
data\u size
将具有消息的长度。但是,
数据
结构的大小大于数据的大小。因此,
write
可能无法将完整数据写入
日志文件

并记下克拉斯·林德贝克的评论。这就是你需要的

请查看答案。

#包括
#包括
#包括
#包括
结构字段
{
无符号字符缓冲区[1024];
结构sockaddr saddr;
鞋垫尺寸;
}数据;
int main()
{
int saddr_大小;
struct fields data;//注意:此变量将隐藏全局变量data。
结构sockaddr saddr;
ssize_t数据大小;
int sock_raw,logfile=1;
//需要插入代码来创建原始套接字。
data_size=recvfrom(sock_raw、data.buffer、1024、0和data.saddr、,
&数据(尺寸);
int cont=write(日志文件、数据和大小数据);
返回0;
}

“&data”是一个指针,是的,您必须使用&data作为
write
函数的参数。但是在您的代码中,变量
data
s没有初始化。嗯,这不是真正的编译。似乎您还没有开始在调用
recvfrom
时使用
数据
结构。噢,谢谢您,先生。但是我如何初始化它呢?可能是我问了一个愚蠢的问题,但我无法理解。您必须在
数据
变量中放入一些数据。如果您不这样做,
数据
包含随机垃圾。在您的小程序中,您只需声明
数据
,但在调用write函数之前,您从未对它做过任何操作。@KlasLindbäck您的意思是说我需要在recvfrom()函数中包含“data”,先生?您不认为
recvfrom
的返回值,即数据大小小于
数据
@Raju的大小吗?您是对的。我在改变,所以我写了一个固定的长度。不过,这可能不是他真正需要的。他需要重新设计协议(即文件结构)。我认为这超出了问题的范围。当然,这不是他现在需要的。但这可能会导致数据丢失,他可能会再次提出同样的问题。无论如何,你的代码似乎很好。@Klaslindb228ck我已经创建了套接字和相关的东西,先生。我刚刚上传了与我的问题相关的一行代码。@Klaslind bäck实际上我的教授告诉我不要修改recvfrom函数,如“&data.buffer”等。他要求我在write api()之前和recvfrom()之后使用结构变量名,这可能会在write api中使用,而不是发送缓冲区。我不知道我该怎么做?
data_size = recvfrom(sock_raw , buffer , 1024, 0 , &saddr , (socklen_t*)&saddr_size);
int cont= write(logfile,&data,data_size); 
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>

struct fields
     {
        unsigned char buffer[1024];
        struct sockaddr saddr;
        socklen_t saddr_size;
     } data;

 int main()
     {
         int saddr_size;
         struct fields data;   // Note: this variable will hide the global variabledata.
         struct sockaddr saddr;
         ssize_t data_size;
         int sock_raw, logfile=1;

         // Need to insert code to create raw socket.

         data_size = recvfrom(sock_raw, data.buffer, 1024, 0, &data.saddr,
                         &data.saddr_size);
         int cont = write(logfile, &data, sizeof data);

         return 0;
     }