账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    网络编程中的socket()和accept()两个函数返回的都是套接字,那么它们具体的区别是什么呢?
    57
    0

    以前只是简单的知道它们是有区别的,但是具体不是很清楚它们有什么区别。希望前辈们可以解答一下疑惑。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • socket()accept()是两个不同的网络编程函数,它们的用途和返回值也有所不同。

      socket()函数是用于创建一个TCP/IP套接字的函数。它的主要目的是获取一个新的TCP连接,并监听该连接的连接请求。当有新的连接请求时,它会创建一个新的套接字对象,并返回这个对象。如果没有新的连接请求,它会返回NULL

      例如,以下是一个使用socket()函数创建TCP连接的示例:

      ```c

      include

      include

      include

      int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; const char *host_name = "localhost";

      // 创建一个服务器套接字
      if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
          perror("socket");
          exit(EXIT_FAILURE);
      }
      
      // 设置服务器的地址和端口号
      server_addr.sin_family = AF_INET;
      server_addr.sin_port = htons(8080);
      if (inet_pton(AF_INET, host_name, &server_addr.sin_addr) <= 0) {
          perror("inet_pton");
          exit(EXIT_FAILURE);
      }
      
      // 连接服务器
      if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
          perror("connect");
          exit(EXIT_FAILURE);
      }
      
      // 创建一个客户端套接字
      if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
          perror("socket");
          exit(EXIT_FAILURE);
      }
      
      // 设置客户端的地址和端口号
      client_addr.sin_family = AF_INET;
      client_addr.sin_port = htons(8080);
      if (inet_pton(AF_INET, host_name, &client_addr.sin_addr) <= 0) {
          perror("inet_pton");
          exit(EXIT_FAILURE);
      }
      
      // 连接客户端
      if (connect(client_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0) {
          perror("connect");
          exit(EXIT_FAILURE);
      }
      
      // 输出服务器的地址
      printf("Server address: %s\n", inet_ntoa(server_addr.sin_addr));
      
      // 处理客户端的连接请求
      while (1) {
          // 接收客户端的连接请求
          if (listen(client_fd, 5) < 0) {
              perror("listen");
              exit(EXIT_FAILURE);
          }
      
          // 获取客户端的套接字对象
          struct sockaddr_in client_addr;
          socklen_t client_addr_len = sizeof(client_addr);
          int client_fd = accept(client_fd, (struct sockaddr *)&client_addr, &client_addr_len);
      
          // 打印客户端的地址
          printf("Client address: %s\n", inet_ntoa(client_addr.sin_addr));
      
          // 进行网络操作
          // ...
      
          // 关闭客户端套接字
          close(client_fd);
      }
      
      return 0;
      

      } ```

      accept()函数是用于接受新的TCP连接的函数。它的主要目的是获取一个新的TCP连接,并监听该连接的连接请求。当有新的连接请求时,它会返回一个新的套接字对象,并将其绑定到连接的地址和端口号上。如果没有新的连接请求,它会返回NULL

      例如,以下是一个使用accept()函数接受TCP连接的示例:

      ```c

      include

      include

      include

      int main() { struct sockaddr_in client_addr, server_addr; const char *host_name = "localhost";

      // 创建一个服务器套接字
      if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
          perror("socket");
          exit(EXIT_FAILURE);
      }
      
      // 设置服务器的地址和端口号
      server_addr.sin_family = AF_INET;
      server_addr.sin_port = htons(8080);
      if (inet_pton(AF_INET, host_name, &server_addr.sin_addr) <= 0) {
          perror("inet_pton");
          exit(EXIT_FAILURE);
      }
      
      // 连接服务器
      if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
          perror("connect");
          exit(EXIT_FAILURE);
      }
      
      // 创建一个客户端套接字
      if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
          perror("socket");
          exit(EXIT_FAILURE);
      }
      
      // 设置客户端的地址和端口号
      client_addr.sin_family = AF_INET;
      client_addr.sin_port = htons(8080);
      if (inet_pton(AF_INET, host_name, &client_addr.sin_addr) <= 0) {
          perror("inet_pton");
          exit(EXIT_FAILURE);
      }
      
      // 连接客户端
      if (connect(client_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0) {
          perror("connect");
          exit(EXIT_FAILURE);
      }
      
      // 创建一个连接对象
      connection *connection = malloc(sizeof(connection));
      
      // 向连接对象添加连接信息
      connection->client_addr = client_addr;
      connection->server_addr = server_addr;
      connection->server_fd = server_fd;
      connection->client_fd = client_fd;
      
      // 设置连接信息
      connection->state = Connection::Connecting;
      connection->status = Connection::Connecting;
      
      // 发送连接请求
      if (write(client_fd, "connect ", 5) < 0) {
          perror("write");
          exit(EXIT_FAILURE);
      }
      
      // 接收连接请求
      if (read(client_fd, "connect ", 5) < 0) {
          perror("read");
          exit(EXIT_FAILURE);
      }
      
      // 创建一个事件监听器
      connection->event_handler = &connection->event_handler;
      
      // 发送连接完成的消息
      if (write(client_fd, "connection complete ", 5) < 0) {
          perror("write");
          exit(EXIT_FAILURE);
      }
      
      // 接收连接完成的消息
      if (read(client_fd, "connection complete ", 5) < 0) {
          perror("read");
          exit(EXIT_FAILURE);
      }
      
      // 关闭连接
      free(connection);
      
      return 0;
      

      } ```

      注意,accept()函数返回的是一个新的连接对象,而不是一个套接字。因此,你不能直接使用这个连接对象进行网络操作,而需要将其传递给相应的函数,如write()read()

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部