我试图在Linux上编写一个程序来连接客户机和服务器,然后当客户机发送消息到服务器时,服务器将该消息打印到控制台。现在我设计的程序如下:当客户端输入类似“嘿,你好吗?“构造具有一些额外信息的消息。消息的格式如下:“[客户端的PID/消息大小:消息]"。因此,如果客户端的PID为4172,则在我们的示例中,组成的消息为:”[4172/17]:嘿,你好吗?]"。此消息被发送到服务器,服务器将其分解,并且仅打印消息,而不包含客户端PID等额外信息。现在我包括了这些信息,以便不浪费内存,因为这使我能够使用动态内存分配。这个程序第一次就能运行。客户端和服务器连接,当客户端发送消息时,服务器将其打印出来。但是,当我再次尝试向它发送消息时,我得到以下错误:
server.out: malloc.c:2617: sysmalloc: Assertion (old_top == initial_t…
…op (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted(core dumped).
服务器代码的相关位是:
//delimCheckBuffer is an array of size 1
void readUntilColon(int fd, char* buffer, size_t index) {
while(read(fd, delimCheckBuffer, 1) > 0) {
if(delimCheckBuffer[0] == ':') {
buffer[index] = ':';
break;
}
buffer[index] = delimCheckBuffer[0];
++index;
}
}
char* messageReconstruct(int fdOfFIFO) {
char* message = calloc(15, sizeof(char)); //Took into account the 4 symbols : / [ ] and
long NumOfCharsInMessage; //assumed that PID and length of message are at most
size_t index = 0; //7 and 4 digits respectively.
readUntilColon(fdOfFIFO, message, 1);
NumOfCharsInMessage = findNumOfCharsInMessage(message);
free(message);
message = calloc(NumOfCharsInMessage, sizeof(char));
while(read(fdOfFIFO, delimCheckBuffer, 1) > 0) {
if(delimCheckBuffer[0] == ']')
break;
message[index] = delimCheckBuffer[0];
++index;
}
return message;
}
我试着用Valgrind调试它。它在readUntilColon()上显示大小为1的无效写入。它特别指出buffer[index] = delimCheckBuffer[0];
是问题所在。但是我还是不明白这一点有什么问题。如果有人能给我解释一下就太好了。谢谢
1条答案
按热度按时间oxiaedzo1#
您需要检查是否没有覆盖缓冲区
相应地称之为。再加几张支票