【问题标题】:Can only connect to Server once with Client in cc 中的客户端只能连接到服务器一次
【发布时间】:2018-10-02 22:33:54
【问题描述】:

我正在用 C 语言编写并创建一个服务器,该服务器一次接收来自多个不同客户端的连接。但是,第一次连接关闭后,服务器就无法再次连接了。

server.c:

#include <stdio.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <sys/types.h>

#include <netinet/in.h>
#include <unistd.h>

int main() {
 while(1) {
  char server_message[256] = "You have reached the server!";

  //Create a socket
  int server_socket;
  server_socket = socket(AF_INET, SOCK_STREAM, 0);

  //Define the server address
  struct sockaddr_in server_address;
  server_address.sin_family = AF_INET;
  server_address.sin_port = htons(9002);
  server_address.sin_addr.s_addr = INADDR_ANY;

  //Bind the socket to the IP and port
  bind(server_socket, (struct sockaddr *) &server_address, 
  sizeof(server_address));

  //Listen for connections
  listen(server_socket, 5);

  //Accept the connection
  int client_socket = accept(server_socket, NULL, NULL);

  //Send message
  send(client_socket, server_message, sizeof(server_message), 0);

  //Close the socket
  close(server_socket);
  }
 return 0;
}

【问题讨论】:

    标签: c sockets server client


    【解决方案1】:

    你正在循环创建一个服务器套接字,接受一个连接,处理它,然后关闭你的服务器套接字。最后一个动作将丢弃所有挂起的连接。您的循环应该在listen() 调用之后立即开始,并在关闭客户端套接字之后终止,并且在关闭服务器套接字之前

    您还忽略了socket(), bind(), listen(), accept(), send()close() 上的所有错误。不要那样做。

    【讨论】:

      【解决方案2】:

      这样改代码(省略错误检查):

      int main() {
      
        //Create a socket
        int server_socket;
        server_socket = socket(AF_INET, SOCK_STREAM, 0);
      
        //Define the server address
        struct sockaddr_in server_address;
        server_address.sin_family = AF_INET;
        server_address.sin_port = htons(9002);
        server_address.sin_addr.s_addr = INADDR_ANY;
      
        //Bind the socket to the IP and port
        bind(server_socket, (struct sockaddr *) &server_address, 
        sizeof(server_address));
      
        //Listen for connections
        listen(server_socket, 5);
      
       while(1) {
        char server_message[256] = "You have reached the server!";
      
         //Accept the connection
         int client_socket = accept(server_socket, NULL, NULL);
         /*check some condition to exit from loop*/
      
         /*or send client to another thread for parallel programing*/
      
         //Send message
         send(client_socket, server_message, sizeof(server_message), 0);
      
         //Close the client socket
         close(client_socket);
        }
      
        close(server_socket);
      
       return 0;
      }
      

      在此代码服务器中,获取客户端后必须等待客户端完成它的工作,然后尝试接受新客户端,如果要并行,接受客户端和客户端中的数据传输,最好将客户端发送和接收放在另一个线程中。

      【讨论】:

        猜你喜欢
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2014-04-26
        • 2015-09-12
        • 2019-06-18
        • 1970-01-01
        • 2013-05-18
        相关资源
        最近更新 更多