gpt4 book ai didi

c - 在客户端-服务器应用程序 (UDP) 中创建并发服务器时出现错误的文件描述符错误

转载 作者:行者123 更新时间:2023-11-30 18:06:20 27 4
gpt4 key购买 nike

我正在使用 udp 和并发服务器制作客户端服务器应用程序,但在将信息发送到服务器时遇到一些问题。

这是服务器的代码:

#define SERV_UDP_PORT   6777

int main() {

int sockfd, newsockfd, clilen, n, pid_hijo;
struct sockaddr_in cli_addr, serv_addr ;
char host_name[200], buffer[1024];

if ((sockfd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)) < 0){
perror("server: can't open datagram socket");
exit(-1);
} /* if */


serv_addr.sin_family = AF_INET ;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY) ;
serv_addr.sin_port = htons(SERV_UDP_PORT);

if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <0) {
perror("server: can't bind local address") ;
exit(-1);
} /* if */


for (;;) {
// Create the new process for the concurrente server
if ((pid_hijo=fork()) == 0) {
servidor_hijo(sockfd);
close(sockfd);
exit(0);
}
else {
close(sockfd);
while (wait((int *)0) != pid_hijo);
}
}
}

int servidor_hijo(int sockfd) {

int n, clilen;
char buffer[1024];
struct sockaddr_in cli_addr;


// Inicializamos los buffers
clilen = sizeof(cli_addr) ;
bzero((char *)&cli_addr,clilen); /* debe inicializarse cli_addr antes del recvfrom */
bzero(buffer, sizeof(buffer));


if ((n=recvfrom(sockfd, buffer, sizeof(buffer),0, (struct sockaddr *)&cli_addr,&clilen)) <0) {
perror("secho: error en funcion recvfrom");
exit(-1);
} /* if */


printf("\n\n%s (%d bytes)\n",buffer,n);

if ((n=sendto(sockfd, buffer, strlen(buffer),0, (struct sockaddr *)&cli_addr,clilen)) <0) {
perror("secho: Error en funcion sendto");
exit(-1);
}
}

这是客户端的代码

/* Cliente de ECO sobre UDP*/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define SERV_UDP_PORT 6777

main() {
int sockfd, n, clilen;
struct sockaddr_in serv_addr, cli_addr ;
char serv_host_addr[30], buffer[1024];

printf("Dirección IP del servidor (a.b.c.d) => ");
gets(serv_host_addr);

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("client: can't open datagram socket") ;
return -1;
}


bzero((char *)&cli_addr,sizeof(cli_addr)); /* puerto cero */
cli_addr.sin_family = AF_INET ;

if (bind(sockfd, (struct sockaddr *) &cli_addr,sizeof(cli_addr)) < 0) {
perror("client: can't bind a port");
exit(-1);
} /* if */

serv_addr.sin_family = AF_INET ;
inet_pton(AF_INET,serv_host_addr,&serv_addr.sin_addr);
serv_addr.sin_port = htons(SERV_UDP_PORT) ;


printf("Bienvenido al Servicio de ECO ==> ");
gets(buffer);

clilen=sizeof(serv_addr);
if ((n=sendto(sockfd, buffer,strlen(buffer),0, (struct sockaddr *)&serv_addr,clilen)) <0) {
perror("cecho: error en funcion sendto");
exit(-1);
} /* if */

printf("cecho: envie %d bytes\n",n);

bzero(buffer,sizeof(buffer));
clilen = sizeof(serv_addr);

if ((n=recvfrom(sockfd,buffer,sizeof(buffer),0, (struct sockaddr*)&serv_addr,&clilen)) < 0) {
perror("cecho: error en funcion recvfrom");
exit(-1);
} /* if */
printf("ECO> %s\n",buffer);
close(sockfd);
}

servidor_hijo 函数使服务器并发回复不同的请求...

问题是......当我执行客户端应用程序时,它将数据包发送到服务器应用程序,但服务器不发送响应并在屏幕上打印一条错误消息,告诉我这是一个“错误文件”描述符错误”。

你能帮我解决这个问题吗?

谢谢大家!!

最佳答案

试试这个:(否则我必须阅读 fork 和 fd)在 fork 的 else 中删除 close,否则套接字将关闭,其他进程想要将数据发送回。

马里奥

关于c - 在客户端-服务器应用程序 (UDP) 中创建并发服务器时出现错误的文件描述符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621243/

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