• socket套接字函数


    Socket套接字函数是用于网络编程的一组API,用于在网络上进行通信。这些函数提供了一种通用的接口,使得程序能够通过网络连接进行数据的发送和接收。下面是对常见的几个Socket函数及其参数的解释:

    1. socket()函数

      • 作用:创建一个套接字。
      • 参数:
        • domain:指定套接字的协议族,常见的有AF_INET(IPv4)和AF_INET6(IPv6)。
        • type:指定套接字的类型,常见的有SOCK_STREAM(流套接字,用于TCP)和SOCK_DGRAM(数据报套接字,用于UDP)。
        • protocol:指定使用的协议,通常传入0表示自动选择合适的协议。
    2. bind()函数

      • 作用:将套接字与特定的IP地址和端口绑定。
      • 参数:
        • sockfd:指定要绑定的套接字。
        • addr:指定要绑定的地址信息,通常是一个包含IP地址和端口号的结构体。
    3. listen()函数

      • 作用:将套接字设为监听状态,开始接受连接请求。
      • 参数:
        • sockfd:指定要监听的套接字。
        • backlog:指定连接队列的最大长度。
    4. accept()函数

      • 作用:接受客户端的连接请求。
      • 参数:
        • sockfd:指定被监听的套接字。
        • addr:(可选)用于存储客户端地址信息的结构体。
        • addrlen:(可选)指定addr结构体的大小。
    5. connect()函数

      • 作用:建立与服务器的连接。
      • 参数:
        • sockfd:指定要连接的套接字。
        • addr:指定服务器的地址信息。
        • addrlen:指定addr结构体的大小。

    这些Socket函数与内核函数之间的关系可以用下图表示:

    1. +---------------------+ +---------------------+
    2. | Application | | Kernel |
    3. +---------------------+ +---------------------+
    4. | |
    5. | Socket API |
    6. | (e.g., socket(), |
    7. | bind(), listen()) |
    8. |------------------------->| |
    9. | System Calls |
    10. |------------------------->| |
    11. | |
    12. | Network Stack |
    13. |------------------------->| |
    14. | |
    15. | Network Hardware |
    16. |<------------------------| |
    17. | |

    服务端的代码 :

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. int main() {
    8. int server_fd, new_socket;
    9. struct sockaddr_in address;
    10. int opt = 1;
    11. int addrlen = sizeof(address);
    12. char buffer[1024] = {0};
    13. char *hello = "Hello from server";
    14. // 创建socket文件描述符
    15. if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
    16. perror("socket failed");
    17. exit(EXIT_FAILURE);
    18. }
    19. // 绑定socket到8080端口
    20. address.sin_family = AF_INET;
    21. address.sin_addr.s_addr = INADDR_ANY;
    22. address.sin_port = htons(8080);
    23. if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
    24. perror("bind failed");
    25. exit(EXIT_FAILURE);
    26. }
    27. // 监听此端口,等待客户端连接
    28. if (listen(server_fd, 3) < 0) {
    29. perror("listen");
    30. exit(EXIT_FAILURE);
    31. }
    32. // 接受客户端连接
    33. if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
    34. perror("accept");
    35. exit(EXIT_FAILURE);
    36. }
    37. // 读取客户端发送的数据
    38. read( new_socket , buffer, 1024);
    39. printf("%s\n",buffer );
    40. // 向客户端发送数据
    41. send(new_socket , hello , strlen(hello) , 0 );
    42. printf("Hello message sent\n");
    43. // 关闭socket
    44. close(server_fd);
    45. return 0;
    46. }

    客户端的代码: 

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int main() {
    9. struct sockaddr_in serv_addr;
    10. int sock = 0;
    11. char *hello = "Hello from client";
    12. char buffer[1024] = {0};
    13. // 创建socket
    14. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    15. printf("\n Socket creation error \n");
    16. return -1;
    17. }
    18. serv_addr.sin_family = AF_INET;
    19. serv_addr.sin_port = htons(8080);
    20. // 将IPv4地址从文本转换为二进制形式
    21. if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
    22. printf("\nInvalid address/ Address not supported \n");
    23. return -1;
    24. }
    25. // 连接到服务器
    26. if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
    27. printf("\nConnection Failed \n");
    28. return -1;
    29. }
    30. // 向服务器发送数据
    31. send(sock , hello , strlen(hello) , 0 );
    32. printf("Hello message sent\n");
    33. // 读取服务器回传的数据
    34. read( sock , buffer, 1024);
    35. printf("%s\n",buffer );
    36. // 关闭socket
    37. close(sock);
    38. return 0;
    39. }

  • 相关阅读:
    uniapp实现App弹窗更新升级(完整版)热更新
    Mac下使用nvm,执行微信小程序自定义处理命令失败
    删除GitLab中的仓库
    数据结构与算法训练:第二十一弹
    微信公众号搜题接口
    spring底层原理初探
    DeepMind CEO 预测 AI 未来:从被动问答到主动的学习者;华为官宣 Pocket 2 发布会
    DNS设置(linux)
    cookie,storage,sesstion区别
    CentOS7 Hadoop3.3.0 安装与配置
  • 原文地址:https://blog.csdn.net/weixin_73951752/article/details/137438971