读取后程序停止工作,但返回值正确

时间:2019-04-12 16:53:35

标签: c tcp

所以我有一个基于TCP协议的客户端服务器C程序。首先,服务器发送客户端要读取的字节数(4个字节(字符串长度)和2个字节的代码),并且工作正常,但是我发送了一个表示lengt的字符串,客户端停止正常工作。

服务器代码:

// char *array = malloc(20000);
// ....
if (write(msg_sock, &filesSendHeader, sizeof(struct AllFiles)) != sizeof(struct AllFiles))
   syserr("partial / failed write");

if (write(msg_sock, array, howMany + 1) != howMany + 1)
   syserr("partial / failed write");

msg_sock是用于从接受函数接收的套接字。

array-大小为20000的字符数组

howMany +1-字符串长度(包括0个字符)

filesSendHeader是struct AllFiles的实例,并保存一个4字节和2字节的数字

客户代码:

  // char *array = malloc(20000);
  // ....
  //For reading first struct
  prev_len = 0;
  while (prev_len < sizeof(struct AllFiles)) {
    received = read(sock, ((char*)&file_info) + prev_len, sizeof(struct AllFiles) - prev_len);
    if (received < 0)
      syserr("reading from server socket");
    prev_len += received;
  }

  // Printing struct AllFiles fields and converting them with ntoh...
  // Then reading a string
  uint32_t to_read = ntohl(file_info.value);
  printf("Bytes read:%ld\n", read(sock, array, to_read));
  printf("Hey");

sock-套接字,客户端通过(从getaddrinfo)连接到服务器

file_info-结构AllFiles的实例

写入套接字后的服务器代码正常执行。客户端打印正确的读取字节数,但会停止工作(程序运行,但打印出倒数第二条指令后未执行任何操作)。没有打印出“ HEY”。

我在做什么错了?

编辑:

我尝试使用valgrind运行程序,但是没有出现内存问题。 在发送字符串长度之前,我还在客户端进行了file_info.value = ntohl(file_info.value);的操作,但是正如我所说的,结构AllFiles可以正确接收(我将其打印出来)。

0 个答案:

没有答案