0

我目前正在用 C 语言做一个客户端/服务器应用程序,该应用程序通过 Internet 进行。服务器将继续侦听来自客户端的新连接。目前我正在监听客户端,但是一旦客户端连接,服务器将不会继续监听更多客户端。下面描述了与客户端连接的服务器端代码:

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in sockaddr, cliaddr;
bzero(&sockaddr, sizeof(struct sockaddr_in));
bzero(&cliaddr, sizeof(struct sockaddr_in));

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = INADDR_ANY;
    sockaddr.sin_port = ntohs(atoi(argv[1]));

if(bind(sockfd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) <0) {
    printf("error binding socket: %d\n", errno);
    exit(1);
}

printf("binded to %d : %d\n", sockaddr.sin_addr.s_addr, htons(sockaddr.sin_port));

listen(sockfd,5);
socklen_t clilen = sizeof(cliaddr);
int newsockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen);
    if (newsockfd < 0) 
        error("ERROR on accept");

printf("server connected to %d:%d\n", cliaddr.sin_addr.s_addr, htons(cliaddr.sin_port));

我假设我必须创建某种形式的线程,一旦建立连接就会分叉。但我不知道如何实现它..

任何帮助是极大的赞赏

4

2 回答 2

3

以下几点可能会有所帮助:

  1. 您应该让您的接受呼叫循环,以便在接受一个连接后,它可以再次返回以接受更多连接。
  2. 要分别处理每个连接,您可以使用pthread_create 或一些类似的线程创建 API创建线程。
  3. 您可以选择使用非阻塞套接字,您可以使用它轻松地在同一线程中处理多个连接。
于 2012-05-15T04:59:22.963 回答
1

您可以收集以下书籍来学习和了解如何用 C 开发并发服务器。答案中很难用示例来解释编写并发服务器的各种方法。书中示例的源代码是可下载的,因此即使没有这本书,您也可以尝试它们(您可以在相同的 URL 中找到)。研究代码,你会看到事情是如何工作的。

UNIX 网络编程,第 1 卷,第二版:网络 API:套接字和 XTI

这本书几乎涵盖了您想了解的有关套接字编程的所有内容。

于 2012-05-15T05:54:01.360 回答