gpt4 book ai didi

c - 使用 select 代替 fork

转载 作者:行者123 更新时间:2023-11-30 18:42:39 24 4
gpt4 key购买 nike

在查看了 Beej 的网络编程指南后,我尝试使用 select 而不是 fork 来重做我的 server.c。我不太确定出了什么问题;我的程序可以编译,但不接受连接。我知道我的包含 i<=fdmax 的循环无法正常运行,但我不明白为什么。 if 语句似乎无法正常工作。

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/select.h>

#define Connections 5

void SignalCatcher(int signum)
{
wait3(NULL,WNOHANG, NULL);
//wait(-1);
}

int main(int argc, char**argv)
{
int listenfd,connfd,n, i;
struct sockaddr_in servaddr,cliaddr;
socklen_t clilen;
pid_t childpid;
char mesg[1000];
FILE *inputFile;
inputFile = fopen("movie.txt", "r");
char returnMsg[1000];
int fdmax, newfd;
fd_set readfd;
fd_set mastersocket;
FD_ZERO(&mastersocket);
FD_ZERO(&readfd);


//Creating socket number
listenfd=socket(AF_INET,SOCK_STREAM,0);

//Setting up the internet address
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(32000);
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

//Listening for clients
listen(listenfd,1024);
FD_SET(listenfd, &mastersocket);
fdmax=listenfd;

//signal(SIGCHLD, SIG_IGN);
signal(SIGCHLD, SignalCatcher);

//Infinite loop that waits for/accepts connections.
for(;;)
{
readfd = mastersocket;
clilen=sizeof(cliaddr);
if(select(fdmax+1, &readfd, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);}
//connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);


for(i=0; i<=fdmax;i++)
{
if (FD_ISSET(i, &readfd)){
if(i==listenfd){
printf("-SUCCESS\n");
clilen = sizeof cliaddr;
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); }



if (connfd!=-1)
{


// if ((childpid = fork()) == 0)
// {
close (listenfd);

for(;;)
{

n = recvfrom(connfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&clilen);

if (n == -1 /*&& errno == EWOULDBLOCK*/) continue;
else if(n==0) break;
//sendto(connfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
//write(connfd , mesg , strlen(mesg)); //both work
//write(connfd , "" , 1);
printf("-------------------------------------------------------\n");
printf("%d",listenfd);
mesg[n] = 0;
printf("Received the following:\n");
printf("%s",mesg);
printf("-------------------------------------------------------\n");

}

// }
close(connfd);

} //if connfd!=-1
}
} //for i<=fdmax
}
}

最佳答案

您可以通过检查函数的返回值来自己回答这个问题。在网络编程中,通常的习惯用法是这样的:

if (foo() < 0) {
fprintf(stderr, "foo: %s\n", strerror(errno));
/* recover from error or... */
exit(EXIT_FAILURE);
}

...哪里foo()bind() 之一, listen() , accept() , send*/recv*()等等。

继续尝试吧。 errno会告诉你出了什么问题。

此外,还不清楚您为什么使用 select()根本不。您所做的就是监听一个套接字,并在有人连接后立即关闭它。相反,您可以只是 accept(listenfd) .

关于c - 使用 select 代替 fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com