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套接字发送和接收int而不是char缓冲区_C_Sockets - Fatal编程技术网

c套接字发送和接收int而不是char缓冲区

c套接字发送和接收int而不是char缓冲区,c,sockets,C,Sockets,1:服务器将文件大小复制到缓冲区并发送: snprintf(t_buf, 255, "%" PRIu32, fsize); if(send(f_sockd, t_buf, sizeof(t_buf), 0) < 0){ perror("error on sending file size\n"); onexit(f_sockd, m_sockd, 0, 2); } snprintf(t_buf,255,“%”PRIu32,fsize); 如果(发送(f_soc

1:服务器将文件大小复制到缓冲区并发送:

  snprintf(t_buf, 255, "%" PRIu32, fsize);
  if(send(f_sockd, t_buf, sizeof(t_buf), 0) < 0){
    perror("error on sending file size\n");
    onexit(f_sockd, m_sockd, 0, 2);
  }
snprintf(t_buf,255,“%”PRIu32,fsize);
如果(发送(f_sockd,t_buf,sizeof(t_buf),0)<0){
perror(“发送文件大小时出错\n”);
onexit(f_-sockd,m_-sockd,0,2);
}
2:客户端接收文件大小并将其放入fsize:

  if(recv(f_sockd, t_buf, sizeof(t_buf), 0) < 0){
    perror("error on receiving file size");
    onexit(f_sockd, 0 ,0 ,1);
  }
  fsize = atoi(t_buf);
if(recv(f_sockd,t_buf,sizeof(t_buf),0)<0){
perror(“接收文件大小错误”);
onexit(f_-sockd,0,0,1);
}
fsize=atoi(t_buf);
-----------------上面的代码使我的程序工作完美!

如果我编写此代码而不是前一个代码,则会出现问题:
1:服务器发送fsize:

  if(send(f_sockd, &fsize, sizeof(fsize), 0) < 0){
    perror("error on sending file size\n");
    onexit(f_sockd, m_sockd, 0, 2);
  }
if(发送(f_sockd,&fsize,sizeof(fsize),0)<0){
perror(“发送文件大小时出错\n”);
onexit(f_-sockd,m_-sockd,0,2);
}
2:客户收到fsize:

  if(recv(f_sockd, &fsize, sizeof(fsize), 0) < 0){
    perror("error on receiving file size");
    onexit(f_sockd, 0, 0, 1);
  }
if(recv(f_sockd,&fsize,sizeof(fsize),0)<0){
perror(“接收文件大小错误”);
onexit(f_-sockd,0,0,1);
}
其中
uint32\u t fsize
字符t_buf[256]

问题是,第一种方法可以全部工作,但第二种方法客户端不能接收所有文件,只能接收其中的一部分。此代码有什么问题?
谢谢

没有更多的数据就很难说

可能是。您应该打印出
fsize
的值

也可能是从
recv()
部分返回,如注释中所述。

不一定会填充完整的输出缓冲区-它可能返回更少的字节,具体取决于可用的数据量:

receive calls通常返回所有可用数据,最多返回请求的金额,而不是等待收到请求的全部金额

返回值(当>0时)将是接收到的字节数,因此如果要确保接收所有内容,可以在循环中调用它

或者,您可以传递
MSG_WAITALL
标志:

此标志请求操作块停止,直到完全请求得到满足。但是,如果捕获到信号、发生错误或断开连接,或者要接收的下一个数据与返回的数据类型不同,则呼叫返回的数据可能仍然少于请求的数据

因此,在您的情况下,您可以执行以下操作:

ssize_t bytes = recv(f_sockd, &fsize, sizeof(fsize), MSG_WAITALL);

if(bytes == sizeof(fsize))
{
    /* received everything */
}
else
{
    /* something went wrong */
}

可能的重复项看起来不像,上面的代码只是错误;-)。客户端和服务器在同一台机器上吗?只有一部分意味着什么?@hmjd是的!巴特:你能解释一下为什么吗?:)我看错了。我以为fsize是指向缓冲区的指针。little endian,我在同一台机器上运行服务器和客户端!服务器发送20个字节,客户端接收1801745249 O.O为什么??:(