Linux服务器套接字 – 错误文件描述符
发布时间:2020-12-13 22:48:58 所属栏目:Linux 来源:网络整理
导读:我在 Linux下遇到服务器套接字问题.由于某些原因,我不知道服务器套接字消失了,并且在等待连接的select调用中出现Bad文件描述符错误.当我在另一个线程中关闭不相关的套接字连接时,总会发生此问题.这种情况发生在2.6.36内核的嵌入式Linux上. 有谁知道为什么会
我在
Linux下遇到服务器套接字问题.由于某些原因,我不知道服务器套接字消失了,并且在等待连接的select调用中出现Bad文件描述符错误.当我在另一个线程中关闭不相关的套接字连接时,总会发生此问题.这种情况发生在2.6.36内核的嵌入式Linux上.
有谁知道为什么会这样?服务器套接字可以简单地消失导致Bad文件描述符是正常的吗? 编辑: 创建服务器套接字的代码如下: int server_socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in saddr; memset(&saddr,sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(1234); const int optionval = 1; setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&optionval,sizeof(optionval)); if (bind(server_socket,(struct sockaddr *) &saddr,sizeof(saddr)) < 0) { perror("bind"); return 0; } if (listen(server_socket,1) < 0) { perror("listen"); return 0; } 我等待使用以下代码进行连接: static int WaitForConnection(int server_socket,struct timeval *timeout) { fd_set read_fds; FD_ZERO(&read_fds); int max_sd = server_socket; FD_SET(server_socket,&read_fds); // This select will result in 'EBADFD' in the error case. // Even though the server socket was not closed with 'close'. int res = select(max_sd + 1,&read_fds,NULL,timeout); if (res > 0) { struct sockaddr_in caddr; socklen_t clen = sizeof(caddr); return accept(server_socket,(struct sockaddr *) &caddr,&clen); } return -1; } 编辑: int error = 0; socklen_t len = sizeof (error); int retval = getsockopt (server_socket,SO_ERROR,&error,&len ); if (retval < 0) { close(server_socket); goto server_start; } 解决方法
套接字(文件描述符)通常会遇到与C中的原始指针相同的管理问题.每当关闭套接字时,不要忘记将-1分配给保留描述符值的变量:
close(socket); socket = -1; 就像你对C指针所做的那样 free(buffer); buffer = NULL; 如果你忘记这样做,你可以稍后关闭套接字两次,因为如果它是指针你将释放两次内存. 另一个问题可能与人们通常忘记的事实有关:UNIX环境中的文件描述符从0开始.如果代码中有某处你有 struct FooData { int foo; int socket; ... } // Either FooData my_data_1 = {0}; // Or FooData my_data_2; memset(&my_data_2,sizeof(my_data_2)); 在这两种情况下,my_data_1和my_data_2都有一个有效的描述符(套接字)值.后来,负责释放FooData结构的一些代码可能会盲目地关闭()这个描述符,这恰好是服务器的监听套接字(0). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |