这是我的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次......仍然无法正常工作......
答案 0 :(得分:1)
你的recvfrom很糟糕。您应该使用sizeof(缓冲区)而不是strlen(缓冲区)。由于缓冲区在堆栈上,你可能在那里有一个大字符串,如果recvfrom获取大量数据,你就会溢出缓冲区。
如果没有帮助,我会更多地研究它。
答案 1 :(得分:1)
问题在于您致电recvfrom
:
ret=recvfrom(sd1,(char *)bufptr,strlen(buffer),0,(struct sockaddr *)&clientaddr,&clen);
第三个参数应该是输入缓冲区的大小。但相反,你在缓冲区上调用strlen
。由于buffer
未初始化,因此在其上调用strlen
正在读取可能导致undefined behavior的未初始化数据。
此外,除非客户端发送空终止字符串(即一些打印机字符后跟空字节),否则对printf
的调用也将调用未定义的行为,因为任何超过读取内容的字节都将是未初始化的。< / p>
传入缓冲区大小减1(为空字节留空)而不是调用strlen
,并事先清除缓冲区。
memset(buffer, 0, sizeof(buffer));
ret=recvfrom(sd1,(char *)bufptr,sizeof(buffer)-1,0,(struct sockaddr *)&clientaddr,&clen);
答案 2 :(得分:0)
我认为你正在关闭程序中的其他地方的套接字。
Bad file descriptor
可能引用无效的文件描述符,或者在代码中的其他位置关闭,或者它已在其他地方使用。我认为你需要稍微调试你的代码,然后很好地管理你的插槽。
您的套接字可能在某处被错误地关闭或被损坏。
您可以尝试使用不同的端口号创建新套接字。