在x86和x86-64之间的套接字和可移植性

3

让我们以这个服务器代码为例来解释我的疑惑:

/* some code */
void *filebuffer = NULL;
/* some other code */

for (size_to_send = fsize; size_to_send > 0; ){
  rc = sendfile(f_sockd, fd, &offset, size_to_send);
  if (rc <= 0){
    perror("sendfile");
    onexit(f_sockd, m_sockd, fd, 3);
  }
  size_to_send -= rc;
}

/* 其他代码 */
// 以下是客户端代码:
/* some code */
void *filebuffer;
/*some other code */
for(size_to_receive = fsize; size_to_receive > 0;){
  nread = read(f_sockd, filebuffer, size_to_receive);
  if(nread < 0){
    perror("read error on retr");
    onexit(f_sockd, 0, 0, 1);
  }
  if(write(fd, filebuffer, nread) != nread){
    perror("write error on retr");
    onexit(f_sockd, 0, 0, 1);
  }
  size_to_receive -= nread;
}
/* other code */

我的问题是:如果服务器在一个x86机器上(小端)而客户端在一个x64机器上(小端),指针不同的大小(4-8字节)是否会导致问题?
如果有,我该如何解决?

注:小端(little endian)是一种字节序排列方式,在这种排列方式中低位字节在前面,高位字节在后面。
1个回答

3
不会有问题,因为您实际上并不会将指针发送到套接字,而只是一串字节流。我唯一担心的问题是如果文件是二进制数据且其中包含64位整数,并且接收平台是32位且不支持64位整数(例如long long),但这很不可能,除非您正在嵌入式系统上接收。
顺便说一下,在接收循环中,您检查了读取错误,但没有检查套接字是否被另一端关闭(当 read 返回 0 时)。

哦,谢谢 :) 我没有考虑到 read=0!不过我将只在英特尔 x86 或 x64 CPU 上使用这个简单的 FTP 服务器和客户端! :) - polslinux
只是好奇:如果一个文件是带有64位整数的二进制数据,我该如何发送呢? :) 谢谢! - polslinux
1
大多数32位平台都支持64位整数,只有在为非x86嵌入式平台编程时才需要担心它。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接