c - 无法解决客户端-服务器程序上大小为 1 的无效读取

标签 c server client valgrind

客户端和服务器通过发送这种类型的结构来交换消息:

typedef struct {
    op_t     op;   
    char sender[MAX_NAME_LENGTH+1];
} message_hdr_t;

typedef struct {
    char receiver[MAX_NAME_LENGTH+1];
    unsigned int   len;  
} message_data_hdr_t;

typedef struct {
    message_data_hdr_t  hdr;
    char               *buf;
} message_data_t;

typedef struct {
    message_hdr_t  hdr;
    message_data_t data;
} message_t;

客户端和服务器之间交换的消息正确到达并且执行继续但 valgrind 返回错误:

==4179== Invalid read of size 1
==4179==    at 0x4C32D04: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179==    by 0x50B84D2: vfprintf (vfprintf.c:1643)
==4179==    by 0x50BFF25: printf (printf.c:33)
==4179==    by 0x10A122: threadF (main.c:151)
==4179==    by 0x4E436DA: start_thread (pthread_create.c:463)
==4179==    by 0x517C88E: clone (clone.S:95)
==4179==  Address 0x5452134 is 0 bytes after a block of size 4 alloc'd
==4179==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179==    by 0x109B2B: readData (connections.h:103)
==4179==    by 0x109C17: readMsg (connections.h:134)
==4179==    by 0x10A0B0: threadF (main.c:146)
==4179==    by 0x4E436DA: start_thread (pthread_create.c:463)
==4179==    by 0x517C88E: clone (clone.S:95)

这就是我在 readData() 中填充服务器结构的方式; 您可以将 readn 视为已读。

#define SYSCALL(r,c,msg) \
    if((r=c)==-1) {perror(msg);

//other reads and writes
msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");            
if(notused==0){
    return -1;
}

当我在 main.c:151 上执行 printf 时出现错误

printf("BODY: %s\n",msg->data.buf);

最佳答案

可能

msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");            

必须是

msg->data.buf=malloc(msg->data.hdr.len + 1);
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len),"read_data_buf");            
msg->data.buf[msg->data.hdr.len] = 0;

为结束的空字符添加位置并设置它

但是您确定msg->data.buf 是可打印的字符串吗?您如何在交换期间对您的结构进行编码?


同样 sizeof(char) 根据定义是 1,乘以它是没有用的

关于c - 无法解决客户端-服务器程序上大小为 1 的无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54539980/

相关文章:

c - linux c 程序 除了读取/var/log 中的文件之外,还有另一种读取日志的方法吗?

C 寻址运算符非常慢

mysql - 配置服务器在本地运行

java - IoT 将数据包从设备发送到网络服务器

python - 从服务器错误地拆封邮件。 Python。 socket

c - 试图使 udp 服务器回显到 udp 客户端并在屏幕上打印,以及让 udp 客户端接收消息

c - 使用局部变量查找函数的返回地址

c - Knuth 的《编程艺术》第三版和欧几里得算法示例

ios - 如何使用swift绕过HTTPS服务器请求

Java-JBoss-Maven : Error getting jboss-as-client 5. 0.1.GA Maven