所以我试图在客户端和服务器之间发送一个结构。我在双方都定义了一个结构:
struct msg {
char name[50];
char time[50];
int len;
char buf[200];
}
问题出现在 server.c
中。我已经在这一行找到了问题:
struct msg s1;
char buffer_input[1024]={0};// the buffer stream for sending
...// omitted all sorts of initializations cuz they all passed my debug and tests
memset(buffer_input,0,sizeof(buffer_input));
memcpy(buffer_input,&s1,sizeof(s1));
/* Originally, the send() call read: */
/* ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen); */
ssize_t size=send(client_sock,buffer_input,sizeof(buffer_input),0);
if(size<0) perror("send()");
然后在标准输出中,我有:
send() : Socket operations on non-socket object
所以我有预感 memcpy(buffer_input,&s1,sizeof(s1))
可能是原因。所以我修改了代码:
memset(buffer_input,0,sizeof(buffer_input));
strcpy(buffer_input,"example");
send() 运行完美,我收到了格式正确的消息。
经过一系列的调试,我发现在memcpy(...)
之后,client socket的文件描述符从8
变成了0
>。
所以我想知道,在什么情况下memcpy
可以修改套接字的文件描述符..
最佳答案
memcpy
不应在任何 情况下修改文件描述符。
它可能做的是在你给它不正确的参数时覆盖内存,考虑到我们掌握的信息,这似乎不太可能(s1
应该大约 300 字节,比您允许用于 buffer
的 1000。
如果您确实拥有该代码(在文本和序列方面,包括不进入或退出函数),那么您的缓冲区对于您的结构来说太小的可能性似乎很小。
我只能建议调试代码。
您需要在调用memcpy
之前,输出以下值:
sizeof(buffer)
。&buffer
.sizeof (s1)
。&s1
.client_sock
。&client_sock
。
然后在调用之后再次输出它们。基于此,我们应该能够通过 memcpy
调用检测(或处理损坏的可能性)。
关于c - memcpy() 修改客户端套接字文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475257/