【发布时间】:2021-09-10 21:09:02
【问题描述】:
我的代码有一个我完全不理解的问题。这是来自服务器的代码:
usr = uslist_return(&users,i);
if(usr != NULL)
{
send(client,usr,sizeof(usr),0);
//Some extra code
}
else
{
utmp.userid = -1;
send(client,&utmp,sizeof(utmp),0);
}
这是来自客户端的代码:
recv(sock,tmp,sizeof(tmp),0);
if(tmp->userid > 0)
{
//Some Code
}
else
{
//Some other code
}
这里的问题是,虽然我检查了 send() 没有发送 NULL 指针,但 send() 发送的指针最终是 NULL。也许它来自recv()。我一点头绪都没有。
忽略 uslist_return(...)。它只是一个返回指针的函数。并且 utmp 与 usr 是同一类型(但不是指针)。
编辑:服务器在 if 括号中发送一个指针,在 else 括号中发送一个结构。当服务器发送指针 usr 并且客户端获取它并将其保存在指针 tmp(相同类型的指针)中时,就会出现问题。由于这个原因,我还没有检查 else 案例。
编辑 2:感谢 Martin James 对此发表评论。 recv() 似乎返回-1。 Perror 显示错误是 Bad Address。我不知道这是什么。
【问题讨论】:
-
send() 发送的指针 I 最终为 NULL - 这是什么意思?你怎么会知道这事?无论如何,
sizeof(usr)是指针的大小,而不是指向的数据。 -
您想调试客户端或服务器。 netcat aka nc 或 socket 是有用的实用程序。在第一种情况下,usr != NULL,这听起来像是一个用户列表,但你执行 sizeof(usr) ,这是变量的大小而不是用户数。在 usr == NULL 中,您没有告诉我们 utmp 是什么。请提供minimal reproducible example
-
如果
usr是指针sizeof(usr)是指针的大小(可能是 4 或 8),而不是它所指向的大小。 -
send(), recv() 返回值,千万不要忽略它们:(
-
"Perror 显示错误是 Bad Address。我不知道这是什么。" 可能是因为
tmp的值不是有效地址。我无法确定,因为您的代码不完整。但是,您发布的代码似乎不正确。您可以通过创建 minimal reproducible example 来改进您的问题。
标签: c pointers client-server