【问题标题】:how to read more than 256 bytes over a socket in C如何通过 C 中的套接字读取超过 256 个字节
【发布时间】:2012-03-29 16:26:00
【问题描述】:

我面临的问题是我的服务器正在发送一个大小为 600 字节的字符串。现在从服务器读取我的客户端使用语句

   n=read(sockfd,rbuffer,255);

rbuffer 是我的缓冲区。

如果我尝试增加读取语句 (255) 中提到的大小,我会遇到分段错误。

现在我知道客户端只接收服务器发送的部分信息。如何修改或更改我读取信息的方式,以便我可以读取所有字节?

PS:字符串的大小太大了,因为我试图发送一个 XML 字符串。

【问题讨论】:

  • 老实说,您从来没有想过阅读 read() 的手册页?

标签: c tcp client


【解决方案1】:

您还需要增加rbuffer 的大小。一种方法可能是:

unsigned char rbuffer[4096];
n = read(socksfd, rbuffer, sizeof(rbuffer));

这样,如果您决定更改尺寸,您只需在一个地方进行。

【讨论】:

  • 你需要将 unsigned char buffer 重命名为 unsigned char rbuffer ;)
【解决方案2】:

好吧,当您查看read() 系统调用文档时,它说最后一个参数是缓冲区的大小。

在您的情况下,您需要确保 rbuffer 足够大!

我猜你在某个地方:

unsigned char rbuffer[255];
n = read( sockfd, rbuffer, 255);

你会想要这样做:

unsigned char rbuffer[1024];
n = read( sockfd, rbuffer, 1024);

为确保不要将无效值作为大小,请使用sizeof( rbuffer ) 如果它是在堆栈上分配的(如上)。

如果是动态分配的,则必须使用分配缓冲区时使用的大小:

int bufsize = 1024;
char *buffer = malloc(bufsize);
n = read( sockfd, buffer, bufsize);

【讨论】:

  • 呃.. malloc(sizeof(char), bufsize) ? malloc 只接受一个参数,char 的大小定义为 1。
  • 你说得对。距离我上次接触 malloc 已经太久了... :-)
  • 最好使用 sizeof 运算符而不是硬编码的整数常量。
猜你喜欢
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多