带有套接字的 c 可移植性代码

标签 c portability

这是我程序的一部分:

  while((total_bytes_read != fsize) && ((nread = read(f_sockd, filebuffer, fsize_tmp)) > 0)){
    if(write(fd, filebuffer, nread) != nread){
      perror("write RETR");
      onexit(f_sockd, 0, 0, 1);
    }
    total_bytes_read += nread;
    fsize_tmp -= nread;
  }

其中total_bytes_read, fsize, nread声明为uint32_t
在64位机器上没有问题,编译运行很好(这部分的代码必须接收一个文件)。
问题是当我在 32 位机器上编译时因为我得到这个错误:
警告:不同符号的整数比较:'ssize_t'(又名'int') 和 'uint32_t'(又名 'unsigned int')[-Wsign-compare] if(write(fd, filebuffer, nread) != nread){
我不知道怎么做解决这个问题,因为如果我改变 if(write(fd, filebuffer, nread) != nread){ to if(nread != (uint32_t)write (fd, filebuffer, nread)){程序不再接收文件但它打印(部分)文件内容到标准输出。< br/> 为什么我会出现这种奇怪的行为,我该如何解决这个问题?

最佳答案

只需使用正确的类型。 The standard说:

ssize_t read(int fildes, void *buf, size_t nbyte);
^^^^^^^                             ^^^^^^

所以这就是您应该使用的。不是int,不是uint64_t,不是unsigned long long

关于带有套接字的 c 可移植性代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164262/

相关文章:

c - 为什么没有按预期调用 printf?

c++ - C/C++ 算法在不同平台上从相同的种子生成相同的伪随机数序列?

c++ - 是否有可能像 Java 一样通过在 VM 中运行来使 C++ 平台独立?

python - 在一个 Bundle 中轻松部署 Python 和应用程序,适用于 Linux

c - %ms 和 %s scanf 之间的区别

c - 有没有比在 C 中使用 #ifdef 更简单的方法?

c - PF4 的中断配置?

c - 使用结构体的哈希表

c++ - 多字符持续警告

c - 如何截获正在写入内存段的指令的地址?