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中创建结构sockaddr__C_Sockets_Network Programming_Byte_Port - Fatal编程技术网

如何以网络字节顺序读取二进制文件并在c中创建结构sockaddr_

如何以网络字节顺序读取二进制文件并在c中创建结构sockaddr_,c,sockets,network-programming,byte,port,C,Sockets,Network Programming,Byte,Port,所以我试图读取一个二进制文件,其中字节按网络字节顺序排列。在这些文件中,它们包含为套接字编程创建结构sockaddru所需的信息。文件的排列方式是,前4个字节表示IPv4地址,后2个字节表示端口号(无删除器或终止器)。 现在,我的麻烦在于试图找到一种读取文件的方法。目前,我正在逐字节读取文件,并将前4个字节存储在4元素数组中,然后将下2个字节存储在2元素数组中。但是,我不确定如何将其转换为结构所需的适当值。有人能为我的实施提供一些建议吗?是否正确 uint64_t address[4]; /

所以我试图读取一个二进制文件,其中字节按网络字节顺序排列。在这些文件中,它们包含为套接字编程创建结构sockaddru所需的信息。文件的排列方式是,前4个字节表示IPv4地址,后2个字节表示端口号(无删除器或终止器)。 现在,我的麻烦在于试图找到一种读取文件的方法。目前,我正在逐字节读取文件,并将前4个字节存储在4元素数组中,然后将下2个字节存储在2元素数组中。但是,我不确定如何将其转换为结构所需的适当值。有人能为我的实施提供一些建议吗?是否正确

  uint64_t address[4]; // a 4 element array
  uint64_t port[2];

  // indexes to help assign bytes to above arrays 
  index1 = 0;
  index2 = 0;

  FILE* ptr = fopen(filename, "rb");
  if (ptr == NULL) {
    perror("Cannot open file.");
    return;
  }

  fseek(ptr, 0, SEEK_END);
  file_len = ftell(ptr); // finding the 
  rewind(ptr);

  for (int i = 0; i < file_len; i++) {
    if (i < 4) {
      fread(address[index1], 1, 1, ptr);
      index1++;
    }
    else if (i >= 4 && i < 6) {

      fread(port[index2], 1, 1, ptr);
      index2++;
    }
  }

  struct sockaddr_in socket_address;
  socket_address.sin_family = AF_INET;

  // i want to assign the 'address' array to this 
  // variable but I'm unsure how to do so
  socket_address.sin_addr.s_addr = // address array;

  // similarly I want to assign the port array to this variable 
  socket_address.sin_port = // port array obtained from above



uint64_t地址[4];//四元素数组
uint64_t端口[2];
//用于帮助将字节分配给上述数组的索引
index1=0;
index2=0;
文件*ptr=fopen(文件名,“rb”);
如果(ptr==NULL){
perror(“无法打开文件”);
返回;
}
fseek(ptr,0,SEEK_END);
文件_len=ftell(ptr);//找到
倒带(ptr);
对于(int i=0;i=4&&i<6){
fread(端口[index2],1,1,ptr);
index2++;
}
}
套接字地址中的结构sockaddr\u;
socket\u address.sin\u family=AF\u INET;
//我想将“地址”数组分配给此
//变量,但我不确定如何做到这一点
socket\u address.sin\u addr.s\u addr=//地址数组;
//类似地,我想将端口数组分配给这个变量
socket\u address.sin\u port=//从上面获得的端口数组
查看此链接,了解指针在little-endian和big-endian系统中是如何精确指向的信息,您的代码应该是这样的

用于读取IPv4

unsigned int ip; // assuming 4 bytes
read(fileno(fp), (void*)&ip, 4);   // This would be sufficient for big-endian systems
ip = ntohl(ip)  // if your system is little-endian
港口

u_int16_t port; 
read(fileno(fp), (void*)&port, 2);   // This would be sufficient for big-endian systems
port = ntohs(port)  // if your system is little-endian
现在变量是系统的本机形式。在中分配给
struct sockaddr_时,您需要将它们转换为网络字节顺序

检查此链接,了解有关指针在小端和大端系统中指向的确切方式的信息,因此您的代码应该是这样的

用于读取IPv4

unsigned int ip; // assuming 4 bytes
read(fileno(fp), (void*)&ip, 4);   // This would be sufficient for big-endian systems
ip = ntohl(ip)  // if your system is little-endian
港口

u_int16_t port; 
read(fileno(fp), (void*)&port, 2);   // This would be sufficient for big-endian systems
port = ntohs(port)  // if your system is little-endian
现在变量是系统的本机形式。在
中分配给
struct sockaddr\u时,需要将它们转换为网络字节顺序