c - memcpy() 修改客户端套接字文件描述符

标签 c sockets

所以我试图在客户端和服务器之间发送一个结构。我在双方都定义了一个结构:

 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/

相关文章:

c - 使用strstr时如何表示 "if substring present in string do something"?

c# - 如何在回发后保持 .NET Socket 对象连接打开?

可以访问网站但不能访问子目录中的文本文件

c - 嵌入式软件可维护性-配置

c++ - 我如何在 C/C++ 中接收原始的第 2 层数据包?

c - Socket 程序演示网络中的链路层通信,无需使用 IP 地址

c - C 中的套接字连接错误

不使用 strcmp 检查密码 (C)

在函数中通过指针调用字符串(语法)

c - 初始化指向 char 数组的指针时出现段错误