【发布时间】:2018-01-22 14:20:08
【问题描述】:
我正在尝试将数据从服务器子进程发送到客户端。 我将第一个客户端 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);
我得到的错误: i=1 中的错误:错误的文件描述符 4 4 5
值 4 和 5 是 fds 的值,并且已正确存储,我不会在任何地方关闭套接字。
【问题讨论】:
-
i未在您的代码中声明 -
您描述的错误意味着其中一个进程正在尝试使用与在该进程中的打开文件描述不对应的文件描述符编号。但是您的代码不包含可以重现问题的完整或可验证的示例。因此,我们只能猜测它的性质。请编辑问题以提供minimal reproducible example,这意味着不仅要添加一些位,还要修改您已有的内容。
-
为了便于阅读和理解:: 请一致地缩进代码,在每个左大括号'{'后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格。
-
感谢大家的建议。我现在正在尝试使用线程来避免共享内存问题。