在write api()中传递struct变量名

时间:2013-11-20 09:26:59

标签: c sockets

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

 struct fields
 { 
     unsigned char buffer[1024];

     socklen_t saddr_size;
 } data; 

2 个答案:

答案 0 :(得分:1)

首先,recvfrom返回消息的长度。

 n = recvfrom(sock,buffer,1024,0,(struct sockaddr *)&from, &length);       
 if (n < 0) error("recvfrom");

此处length是您正在使用的套接字结构的大小。必须在调用recvfrom之前对其进行初始化,以便内核知道有多少空间可用于返回套接字地址。

另请注意,(struct sockaddr *)&from将具有用于发送数据报的远程套接字的地址。

现在,在你的电话中

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

data_size将具有消息的长度。但是,data结构的大小大于data_size的大小。因此,write可能无法将完整数据写入logfile

并记下KlasLindbäck的评论。这就是你需要的。

请参阅答案here

答案 1 :(得分:0)

#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;
     }