如何在c套接字程序中将结构变量复制到缓冲区中?

如何在c套接字程序中将结构变量复制到缓冲区中?,c,sockets,C,Sockets,在客户端,我需要从网络接收数据包并将其写入一个文件,该文件将被发送到服务器进行进一步处理 接收和处理数据包时出现问题,因为我过去只发送一个缓冲区,而不是write()api中的“saddr”及其“size” 因此,我使用结构来声明所有成员,如buffer、saddr、saddr\u size。 这是我的数据捕获代码: int logfile; struct sockaddr_in source, dest; struct fields{ //edited voi

在客户端,我需要从网络接收数据包并将其写入一个文件,该文件将被发送到服务器进行进一步处理

接收和处理数据包时出现问题,因为我过去只发送一个缓冲区,而不是write()api中的“saddr”及其“size”

因此,我使用结构来声明所有成员,如buffer、saddr、saddr\u size。 这是我的数据捕获代码:

int logfile;
struct sockaddr_in source, dest;

struct fields{               //edited
  void* b;   
  struct sockaddr *s;
  socklen_t *ssize;
}data; 

int main()
{
  int saddr_size, data_size;
  struct fields data;
  struct sockaddr saddr;

  gopromiscous();

  unsigned char *buffer = (unsigned char *) malloc(1024);

  logfile = open("sniff_data.bin", O_CREAT | O_WRONLY | O_APPEND, 0777);
  if (logfile == -1)
  {
    printf("Unable to create sniff_data file.");
  }
  printf("\n Client Receiving the Packets...\n");

  int sock_raw = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  setsockopt(sock_raw, SOL_SOCKET, SO_BINDTODEVICE, "eth0", strlen("eth0") + 1);

  if (sock_raw < 0)
  {
    perror("Socket Error");
    return 1;
  }

  int count = 10;
  while (count >= 0)
  {
    count--;
    saddr_size = sizeof saddr;
    //Receive a packet      
    data_size = recvfrom(sock_raw, buffer, 1024, 0, &saddr,
        (socklen_t*) &saddr_size);

    // i have created struct to buffer,saddr and saddr_size above
    if (data_size < 0)
    {
      printf("Recvfrom error , failed to get packets\n");
      return 1;
    }

    //i need to copy the values of buffer, saddr and sddr_size into a variable and      
    //then use that variable in write api 

    strcpy(data.b,buffer);         //edited
    data.s=&saddr;
    data.ssize=(socklen_t*)&saddr_size;

    int cont = write(logfile, &data, data_size);

  }
  printf("\n Done\n");
  close(logfile);
  close(sock_raw);
  return 0;
}

int gopromiscous()
{
  int fd;
  struct ifreq eth;

  fd = socket(AF_INET, SOCK_PACKET, htons(0x800));

  strcpy(eth.ifr_name, "eth0");

  ioctl(fd, SIOCGIFFLAGS, &eth);

  eth.ifr_flags |= IFF_PROMISC;

  ioctl(fd, SIOCSIFFLAGS, &eth);

  printf("\n Entered Promiscuous Mode Successfully\n");
}
当我编译这个数据处理代码时,我得到了一个错误 (socklen_t*)saddr_size=*(data2.ssize); 警告:从不同大小的整数转换为指针[-Wint转换为指针] 错误:赋值的左操作数需要左值


我以前曾发布过这个问题,但我无法得到答案。因此,我们通过上传整个修改后的代码再次发布了它。请有人帮帮我。

代码有很多错误。要首先回答问题,必须使用strcpy(data.buffer,(char*)(&data)->saddr)

代码中的其他错误包括:

  • 您已经定义了一个结构,从未用于更新SADD。相反,您使用了单独的SADD变量
  • “数据”不是您尝试用“->”访问的指针。结构中的“saddr”变量被声明为指针
  • 即使使用该结构,在使用它之前也必须为在该结构中声明的指针分配内存。否则你将面临分割错误
  • 分配的内存没有为“buffer”变量释放
  • 这种读取网络数据的方法不是正确的方法。请参阅“选择”系统调用和异步读取套接字编程

  • 如果您正在使用“gcc”编译器,请使用选项“-Wall-Wextra”,它将显示您的所有错误。

    您的代码并不完全清楚要将值从哪个变量复制到哪个变量。但我的一点理解是,你可以做到以下几点:

    strcpy(data.buffer,buffer); //i guess you need to copy data that you received from socket to the variable buffer in data(a variable of fields struct)
    //i guess you need to copy received saddr to the saddr(in data variable) and as it's a pointer then you can simply assign the saddr to that pointer.
    data->saddr = &saddr;
    //and same assignment should work for size variable
    
    试试看它是否适合你

    你可以这样做 将结构更改为

    struct fields{ 
            char  buffer[1024];   
            struct sockaddr saddr;
            socklen_t saddr_size;
    }data; 
    
    然后在代码中

    memcpy(data.buffer,buffer,sizeof buffer);
    memcpy(&data.saddr,&saddr,sizeof saddr);
    memcpy(&data.saddr_size,&saddr_size,sizeof(saddr_size));
    int cont = write(logfile, &data, data_size);
    

    我同意Parthiban.你的问题不仅仅是写日志文件。事实上,纠正代码中的其他错误很简单
    int
    socklen\u t
    大小不同的系统上,这会错误地失败。好的,我已经修改了代码。先生,现在您能告诉我是否有错误吗?
    memcpy(data.buffer,buffer,sizeof buffer);
    memcpy(&data.saddr,&saddr,sizeof saddr);
    memcpy(&data.saddr_size,&saddr_size,sizeof(saddr_size));
    int cont = write(logfile, &data, data_size);