的memcpy()修改客户端套接字文件描述符
问题描述:
所以我尝试与客户端之间server.I发送结构两侧形成的结构:在server.c
发生的memcpy()修改客户端套接字文件描述符
struct msg {
char name[50];
char time[50];
int len;
char buf[200];
}
问题。我已经找到问题在这一行:
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(...)
之后,客户端套接字的文件描述符从8
变成0
。
所以我想知道在什么情况下可以memcpy
修改插座的文件描述符..
答
应行
ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen);
阅读
ssize_t size=send(client_sock, buffer_input, 1024);
或只是摆脱buffer_input
和有
ssize_t size=send(client_sock, &s1, sizeof(s1));
(!你还可以删除memset的东西,以及)
编辑
些咖啡后,这里是一个更好的解决方案:
/* 50 + 100 + 100 + 4 */
#define BUFFER_LENGTH 254
...
unsigned char buffer[BUFFER_LENGTH];
...
memcpy(buffer, s1.name, 50);
memcpy(buffer + 50, s1.time, 50);
uint32_t net_len = htonl(s1.len);
memcpy(buffer + 100, &net_len, 4);
memcpy(buffer + 104, ss1.buf, 100);
...
ssize_t size=send(client_sock, buffer, BUFFER_LEN);
答
memcpy
不应,任何的情况下,修改文件描述符。
它所可能做的是覆盖内存,如果你给它不正确的参数,这似乎不太可能,因为我们有信息(s1
应在300字节,比你允许buffer
1000少得多)。
如果你的代码确实是你所拥有的(包括文本和顺序,包括不进入或退出函数),那么你的缓冲区对于你的结构太小的可能性似乎很低。
我可以建议的只是调试代码。
您需要,调用memcpy
,输出以下值前:
-
sizeof(buffer)
。 -
&buffer
。 -
sizeof (s1)
。 -
&s1
。 -
client_sock
。 -
&client_sock
。
然后在呼叫后再次输出它们。基于此,我们应该能够通过memcpy
呼叫检测(或处置)腐败的可能性。
请确保您已完全复制导致出现问题的代码,以便在某人的答案显示代码中存在错误时不必编辑该问题。这对每个人都很困难。 – 2012-02-28 02:02:27
什么是's1';什么是'sizeof(s1)'?在它的表面上,sizeof(s1)> sizeof(buffer_input)'因此你的'memcpy()'是践踏的边界,它所践踏的其中一个位恰好是你的文件描述符。添加一些断言 - 'assert(sizeof(s1) 2012-02-28 02:07:34