[英]error bad file descriptor while send on socket
我试图将数据从服务器子进程发送到客户端。 我将第一个客户端fd存储在ids [0]中,将第二个fd存储在ids [1]中,然后我尝试将数据从第一个子进程发送到另一个客户端,反之亦然。
我得到了错误的文件描述符错误。
//ids are defined at the begining as follows
int *ids = (int *) mmap(NULL,5*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
//accept is in a for loop...
mysocket = accept(sock, NULL, NULL);
printf("\nClient connected ...\n ");
ids[i]=mysocket;
i++;
printf(" socket and id %d %d",mysocket,ids[i-1]);
int pid = fork();
if (pid == 0) {
if (mysocket < 0) {
perror("Error in accept");
exit(1);
}
do {
fflush(stdout);
//clearing the bufffer
//memset(&buf[0], 0, sizeof(buf));
//memset(buf, sizeof(buf), '\0');
//reading message on the socket.
if(i==1)
if(send(ids[1], buf, 1024,0)==-1){
perror("error in i=1");
printf("%d %d %d",mysocket,ids[0],ids[1]);
}
if(i==2) {
if(send(ids[0], buf, 1024,0)==-1) {
perror("error in i=2");
printf("%d %d %d", mysocket, ids[0], ids[1]);
}
}
if (strcmp(buf, "CLOSE") == 0) {
close(mysocket);
break;
}
} while (1);
我得到的错误:我= 1中的错误:错误的文件描述符4 4 5
值4和5是fds的值,并且已正确存储,并且我没有在任何地方关闭套接字。
您的代码格式错误,希望我能正确解释。
ids[i]=mysocket;
i++;
如果i
为0
则ids[0]
现在有效, ids[1]
仍然无效(即具有一些看似有效的任意值,但无效),而i
现在为1
。 在i==1
的情况下,孩子会遇到以下代码(正确格式化后):
if(i==1)
if(send(ids[1], buf, 1024,0)==-1){
perror("error in i=1");
printf("%d %d %d",mysocket,ids[0],ids[1]);
}
如您所见,它使用send(ids[1]...
但是如上i==1
只有ids[0]
具有有效值,而ids[1]
值无效,因此send
失败带有Bad file descriptor
。
我的猜测是,您假定在主进程中创建的文件描述符实际上在所有子进程中均有效,因为您试图在子进程和主进程之间使用共享数组(使用MAP_SHARED
):
int *ids = (int *) mmap(NULL,5*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
但是这个假设是错误的。 文件描述符不会传播到所有子进程中,而只会在派生到新的子进程时传播。 这意味着您的第一个孩子将仅在fds[0]
具有有效的文件描述符,而第二个孩子将在fds[0]
和fds[1]
中均具有有效的文件描述符。 由于共享数组,第一个孩子将在fds[1]
中看到与第二个孩子相同的文件号,但这并不意味着该文件号也与有效(内核)文件描述符关联。
请注意,在代码中实际记录代码的意图非常有用。 这样,其他人可以更好地理解您的代码,并且所有人(包括您)都可以更好地验证意图是否确实与实现相匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.