[英]Linux Socket Bad File Descriptor
I couldn't find a duplicate, so I decided to post. 我找不到重复的邮件,因此决定发布。 We're getting into Sockets (beginner-level) now, and was given the code below to make the client send a simple message to the server by using send()
and recv()
. 我们现在进入Sockets(入门级),并获得以下代码,使客户端可以使用send()
和recv()
send()
服务器发送一条简单的消息。 However, everything I have tried doesn't seem to get rid of the error: Bad File Descriptor
and newsockfd
always returns the value -1
. 但是,我尝试过的所有事情似乎都没有摆脱error: Bad File Descriptor
和newsockfd
始终返回值-1
。 I'm confused and have no idea why it doesn't work. 我很困惑,也不知道为什么它不起作用。
defs.h 的defs.h
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERV_TCP_PORT 6000
#define SERV_HOST_ADDR "127.0.0.1"
char *pname;
client.c client.c
#include "../defs.h"
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
main(argc, argv)
int argc;
char *argv[];
{
int sockfd;
struct sockaddr_in serv_addr;
pname=argv[0];
bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(SERV_HOST_ADDR);
serv_addr.sin_port=htons(SERV_TCP_PORT);
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) {
printf("client: can't open stream socket\n");
exit(0);
}
if (connect(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("client: can't connect to server\n");
exit(0);
}
send(sockfd,"1",1,0);
close(sockfd);
exit(0);
}
server.c server.c
#include "../defs.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <strings.h>
void error(char *msg)
{
perror(msg);
exit(1);
}
main(argc, argv)
int argc;
char *argv[];
{
int sockfd,clilen, childpid;
int newsockfd;
char buff[255];
struct sockaddr_in cli_addr, serv_addr;
if ((sockfd=socket(AF_INET,SOCK_STREAM, 0)) <0) {
printf("server: can't open stream socket\n");
exit(0);
}
bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERV_TCP_PORT);
if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("server: can't bind local address\n");
exit(0);
}
listen(sockfd, 5);
for ( ; ; ) {
clilen=sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
printf("%d\n",newsockfd);
if(newsockfd < 0) {
printf("server: accept error\n");
error("ERROR on accept");
exit(0);
}
if((childpid=fork()) <0) {
printf("server: fork error\n");
exit(0);
}
else if (childpid==0) {
close(sockfd);
recv(newsockfd,buff,sizeof(buff),0);
}
close(newsockfd);
}
}
Thanks for your time. 谢谢你的时间。
In the code of the child you close sockfd
, which represents the server. 在子代的代码中, 关闭代表服务器的sockfd
。 But in the next iteration of the infinite for-loop, which the child also runs , you attempt to accept()
a new client using sockfd
. 但是, 在子代也要运行的无限for循环的下一个迭代中,您尝试使用 sockfd
accept()
一个新客户端。 Therefore, sockfd
is a Bad file descriptor
. 因此, sockfd
是Bad file descriptor
。
Remove the close(sockfd);
删除close(sockfd);
line in your code and close it when you can be absolutely sure it is not needed anymore. 在您的代码中排成一行并在绝对可以确定不再需要它时将其关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.