所以我有一个基于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可以正确接收(我将其打印出来)。