socket形貌符的本质,它可以和服务器建立毗连?一个服务器和一个客户端的通 ...

打印 上一主题 下一主题

主题 992|帖子 992|积分 2976

 形貌符的本质

    socket 形貌符(在类 Unix 系统中是一个非负整数,在 Windows 系统中是 SOCKET 句柄)本质上是操作系统为了管理网络毗连而分配的一个索引值,它用于标识一个打开的网络套接字,方便后续对该套接字进行读写、关闭等操作。
    socket 形貌符(socket descriptor)是可以用于和服务器建立毗连的。
 
客户端的 socket 形貌符


在客户端,通常会使用一个 socket 形貌符来完成与服务器的毗连和通讯,其创建和使用过程如下:
1. 创建 socket 形貌符

客户端首先使用 socket 函数创建一个 socket 形貌符,这个形貌符代表了客户端用于网络通讯的端点。示例代码如下:
  1. #include <sys/socket.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <arpa/inet.h>
  5. #include <unistd.h>
  6. #define PORT 8888
  7. #define SERVER_IP "127.0.0.1"
  8. int main() {
  9.     int client_socket;
  10.     // 创建客户端 socket 描述符
  11.     client_socket = socket(AF_INET, SOCK_STREAM, 0);
  12.     if (client_socket == -1) {
  13.         perror("socket creation failed");
  14.         return -1;
  15.     }
  16.     // 后续代码...
  17.     close(client_socket);
  18.     return 0;
  19. }
复制代码
这里 client_socket 就是客户端创建的 socket 形貌符,AF_INET 表现使用 IPv4 地址族,SOCK_STREAM 表现使用面向毗连的 TCP 协议。
2. 毗连到服务器


客户端使用 connect 函数,通过这个 socket 形貌符向服务器发起毗连请求:

  1.     struct sockaddr_in server_addr;
  2.     server_addr.sin_family = AF_INET;
  3.     server_addr.sin_port = htons(PORT);
  4.     if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {
  5.         perror("Invalid address/ Address not supported");
  6.         return -1;
  7.     }
  8.     if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
  9.         perror("connection failed");
  10.         close(client_socket);
  11.         return -1;
  12.     }
复制代码
此时,客户端的 client_socket 形貌符就与服务器建立了毗连,可以用于后续的数据收发。
3. 数据收发和关闭毗连

客户端可以使用 send 和 recv 函数通过 client_socket 形貌符进行数据的发送和接收,通讯竣事后使用 close 函数关闭该形貌符:
  1.     char message[] = "Hello, server!";
  2.     if (send(client_socket, message, sizeof(message), 0) == -1) {
  3.         perror("send failed");
  4.         close(client_socket);
  5.         return -1;
  6.     }
  7.     char buffer[1024];
  8.     ssize_t bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
  9.     if (bytes_received == -1) {
  10.         perror("recv failed");
  11.         close(client_socket);
  12.         return -1;
  13.     }
  14.     close(client_socket);
复制代码
服务器端的 socket 形貌符

在服务器端,通常会使用至少两个 socket 形貌符来完成与客户端的通讯,分别是监听 socket 形貌符和毗连 socket 形貌符。
1. 监听 socket 形貌符

服务器首先创建一个监听 socket 形貌符,用于监听客户端的毗连请求:
  1. #include <sys/socket.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <arpa/inet.h>
  5. #include <unistd.h>
  6. #define PORT 8888
  7. #define BACKLOG 5
  8. int main() {
  9.     int listen_socket;
  10.     // 创建监听 socket 描述符
  11.     listen_socket = socket(AF_INET, SOCK_STREAM, 0);
  12.     if (listen_socket == -1) {
  13.         perror("socket creation failed");
  14.         return -1;
  15.     }
  16.     struct sockaddr_in server_addr;
  17.     server_addr.sin_family = AF_INET;
  18.     server_addr.sin_addr.s_addr = INADDR_ANY;
  19.     server_addr.sin_port = htons(PORT);
  20.     // 绑定地址和端口
  21.     if (bind(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
  22.         perror("bind failed");
  23.         close(listen_socket);
  24.         return -1;
  25.     }
  26.     // 开始监听
  27.     if (listen(listen_socket, BACKLOG) == -1) {
  28.         perror("listen failed");
  29.         close(listen_socket);
  30.         return -1;
  31.     }
  32.     // 后续代码...
  33.     close(listen_socket);
  34.     return 0;
  35. }
复制代码

这里的 listen_socket 就是监听 socket 形貌符,它的作用是绑定服务器的地址和端口,并开始监听客户端的毗连请求。BACKLOG 表现毗连请求队列的最大长度。
2. 毗连 socket 形貌符

当有客户端发起毗连请求时,服务器使用 accept 函数从监听队列中取出一个毗连请求,并创建一个新的毗连 socket 形貌符来与该客户端进行通讯:

  1.     struct sockaddr_in client_addr;
  2.     socklen_t client_addr_len = sizeof(client_addr);
  3.     int client_socket;
  4.     // 接受客户端连接
  5.     client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &client_addr_len);
  6.     if (client_socket == -1) {
  7.         perror("accept failed");
  8.         close(listen_socket);
  9.         return -1;
  10.     }
  11.     // 后续代码...
  12.     close(client_socket);
复制代码
client_socket 就是毗连 socket 形貌符,它代表了服务器与特定客户端之间的毗连。服务器可以使用 send 和 recv 函数通过这个形貌符与客户端进行数据的收发。




  • 客户端的 socket 形貌符:用于创建与服务器的毗连,以及后续与服务器之间的数据收发和关闭毗连操作。
  • 服务器的监听 socket 形貌符:用于绑定服务器的地址和端口,监听客户端的毗连请求。
  • 服务器的毗连 socket 形貌符:当有客户端毗连请求到达时,服务器创建该形貌符来与特定客户端进行一对一的数据通讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表