C 读取套接字和记忆未按预期工作
我对此代码有以下问题:C 读取套接字和记忆未按预期工作,c,sockets,C,Sockets,我对此代码有以下问题: #define success "success" #define fail "fail" char *verify = fail; char b[1024]; int main(){ ... ...connect to server code... ... read(sock,verify,1024); printf("%s",verify); //there's the problem, it always prints fail. I
#define success "success"
#define fail "fail"
char *verify = fail;
char b[1024];
int main(){
...
...connect to server code...
...
read(sock,verify,1024);
printf("%s",verify); //there's the problem, it always prints fail. If I change with this:
read(sock,b,1024);
printf("%s",b); //this works and prints the received string.
}
你能帮我理解吗?问题出在代码的这一部分,还是应该在其他地方检查
如果我在代码中做了一个简单的赋值,比如“verify=success”,它似乎工作得很好,从一个socket读取与从一个asisgnation读取不一样?您尝试从socket读取到
verify
指向的内存区域,即“fail”
。
在C中,表达式“fail”
在只读内存中分配5个字节,在编译时用{f'、'a'、'i'、'l'、'\0'}
填充它们并返回其地址
所以您试图覆盖只读内存。我想知道你为什么没有分段错误。您是否检查了读取的返回值?它可能是read
中的内核端健全性检查,防止它尝试写入RO内存
在第二个read
调用中,它没有问题,因为b
指向数组变量的开头,该变量是可写的
实际上,您正在将自己与自己的编码风格混淆:定义fail
,它看起来像一个变量,但并不使它成为一个变量。C预处理器只是替换了它,结果是
char *verify = "fail";
您正在写入只读内存(字符串literal
“fail”
)。我感到震惊的是,它甚至执行时没有出现错误,当然,除非你的套接字设置失败(双关语),并且导致的read
是一个被忽略的错误导致的no-op。@WhozCraig该死,你有理由,这是一个多么愚蠢的问题:(谢谢!还有,read()
不创建以null结尾的字符串。您不应在其输入缓冲区上使用字符串函数。@如果我也在服务器中定义字符串success,并将其发送到客户端,然后用read()读取,然后使用strcmp(success,b),这应该可以正常工作,对吗?另外,如果我从服务器向客户端发送以null结尾的字符串,这应该作为以null结尾的字符串存储在b中,对吗?不。如果这是流套接字,则没有消息边界。read()
可能不会返回一次调用中写入的所有内容,您可能必须循环才能获取所有内容。