【问题标题】:Client / Server C Connection客户端/服务器 C 连接
【发布时间】:2012-05-22 14:05:37
【问题描述】:

我目前正在用 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));

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

非常感谢任何帮助

【问题讨论】:

    标签: c client-server


    【解决方案1】:

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

    1. 您应该让您的接受调用循环,以便在接受一个连接后,它可以再次返回以接受更多连接。
    2. 要分别处理每个连接,您可以使用pthread_create or some similar thread creation APIs 创建线程。
    3. 您可以选择使用Non-Blocking sockets,使用它可以轻松地在同一线程中处理多个连接。

    【讨论】:

    • 感谢您的回复...将在您指出的以下几点上查找更多
    【解决方案2】:

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

    UNIX Network Programming, Volume 1, Second Edition: Networking APIs: Sockets and XTI

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

    【讨论】:

    • 不客气。如果您需要讨论与 UNIX 系统/网络编程相关的内容,可以通过 mrayub@gmail.com 联系我。我从上面提到的书中学习了网络编程,现在我对网络编程有了很好的了解,目前我正在为我的项目的一些特定需求编写一个 Web 服务器。如果可能的话,我可以帮你出主意。
    猜你喜欢
    • 2023-04-09
    • 2016-07-06
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多