[英]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.