gpt4 book ai didi

c - 错误的文件描述符 : error on accept()

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:52 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的聊天应用程序,其中客户端从服务器接收一个字符串并发送一条新消息,该消息将传递给下一个连接的客户端。我是套接字编程的新手,我真的不明白为什么会出现这个错误。客户端发送缓冲区后,服务器通知 accept() 错误(返回 -1)和错误的文件描述符。这是在服务器上运行的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(char *msg) {
perror(msg);
exit(1);
}

int main (int argc, char *argv[] ) {

if ( argc < 2 ) {
error("ERROR, no port provided\n");
}

int sockfd;
struct sockaddr_in serv_addr, cli_addr;
int cli_len, portno;
char message[256];
pid_t pid;
int n;

portno = atoi( argv[1] );
bzero( (char*)&serv_addr, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons( portno );

sockfd = socket( AF_INET, SOCK_STREAM, 0 );

n = bind ( sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr) );
if ( n < 0 ) {
error("ERROR on binding\n");
}

listen( sockfd, 5 );

do {
cli_len = sizeof(cli_addr);

int newsockfd;
newsockfd = accept( sockfd,(struct sockaddr*)&cli_addr,(socklen_t *)&cli_len);
if ( newsockfd < 0 ) {
printf("%i", newsockfd);
error("ERROR on accept\n");

}

pid = fork();
if( pid == 0 ) {

close( sockfd );
sockfd = -1;

n = send( newsockfd, message, strlen(message), 0);
if ( n < 0 ) error("ERROR sending\n");

bzero(message, 256);

n = recv( newsockfd, message, 256, 0);
if ( n < 0 ) error("ERROR receiving\n");

close( newsockfd );
newsockfd = -1;

}

}
while( 1 );

return 0;
}

最佳答案

如果 fork() 的结果为零,您需要使用已接受的套接字执行 I/O 然后退出进程。目前,您允许接受循环在关闭监听套接字后在子进程中重复。

关于c - 错误的文件描述符 : error on accept(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37435072/

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