![](/img/trans.png)
[英]recvfrom() gives a bad file descriptor error when used in POSIX thread in C
[英]Bad file descriptor in recvfrom function
這是udp的服務器端代碼
#include"headers.h"
int main(int argc,char **argv)
{
//------------udp server socket connection------//
int sd1;
struct sockaddr_in serveraddr, clientaddr;
char buffer[100];
char *bufptr = buffer;
int cnt=1,ret;
socklen_t clen;
clen=sizeof(clientaddr);
//int buflen = sizeof(buffer);
sd1=socket(AF_INET,SOCK_DGRAM,0);
printf("udp socket id=%d\n",sd1);
printf("socket created for udp..\n");
if(sd1<0)
{
perror("udp_sfd");
exit(0);
}
printf("server socket created..\n");
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sd1,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
perror("bind\n");
exit(0);
}
else
{
while(1)
{
printf("server accept from client\n");
ret=recvfrom(sd1,(char *)bufptr,strlen(buffer),0,(struct sockaddr *)&clientaddr,&clen);
printf("ret=%d\n",ret);
//printf("hello\n");
if(ret<0)
{
perror("recvfrom");
exit(0);
}
else
{
printf("UDP Server received the following:\n \"%s\" message\n", bufptr);
}
//close(sd1);
}
}
close(sd1);
return 0;
}
我從客戶端發送緩沖區...在服務器端它給我一個這樣的錯誤....
錯誤的文件描述符....我該怎么做...
我也改變了文件描述符的名稱2次...仍然沒有工作......
你的recvfrom很糟糕。 您應該使用sizeof(緩沖區)而不是strlen(緩沖區)。 由於緩沖區位於堆棧上,因此您可能在其中有一個大字符串,如果recvfrom獲取大量數據,則會溢出緩沖區。
如果這沒有用,我會再研究一下。
問題在於您對recvfrom
的調用:
ret=recvfrom(sd1,(char *)bufptr,strlen(buffer),0,(struct sockaddr *)&clientaddr,&clen);
第三個參數應該是輸入緩沖區的大小。 但相反,你在緩沖區上調用strlen
。 因為buffer
是未初始化的,所以在其上調用strlen
是讀取未初始化的數據,這可能導致未定義的行為 。
此外,除非客戶端發送空終止字符串(即一些打印機字符后跟空字節),否則對printf
的調用也將調用未定義的行為,因為任何超過讀取內容的字節都將是未初始化的。
傳入緩沖區大小減1(為空字節留空間)而不是調用strlen
,並事先清除緩沖區。
memset(buffer, 0, sizeof(buffer));
ret=recvfrom(sd1,(char *)bufptr,sizeof(buffer)-1,0,(struct sockaddr *)&clientaddr,&clen);
我認為你正在關閉程序中的其他地方的套接字。
Bad file descriptor
可能引用無效的文件描述符,或者在代碼中的其他位置關閉,或者它已在其他地方使用。 我認為您需要稍微調試一下代碼,然后很好地管理您的套接字。
您的套接字可能被錯誤地關閉或被損壞。
您也可以嘗試使用不同的端口號創建新套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.