zoukankan      html  css  js  c++  java
  • 创建一个简单TCP的c/s模型服务器用到的基本函数

    connect()

    作用:

      将套接字连接到目的地址,客户端通过调用connect函数来建立与TCP服务器的连接。简单的说就是用来连接服务器。
    头文件:

      #include<sys/socket.h>
    函数原型:

      int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    参数说明:
      参数sockfd:为客户端的socket描述字

      参数addr:为服务器的socket地址

      参数addrlen:为socket地址的长度

    返回值:

      成功返回0,失败返回-1

     

    bind()

    作用:

      把一个地址族中的特定地址赋给socket。

    头文件:

      #include<sys/socket.h>

    函数原型:

      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    参数说明:

      参数sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识 一个socket。bind()函数就是将给这个描述字绑定一个名字。

      参数addr:一个const struct sockaddr *指针,指向要绑定给sockfd的 协议地址。这个地址结构根据地址创建socket时的地址协议族 的不同而不同。
          IPV4:
          struct in_addr{

            uint32_t s_addr; /* 32位IPv4地址 */
          };
          struct sockaddr_in{
            sa_family_t sin_family; /* //地址族 */

            in_port_t sin_port; /* 16位TCP/UDP端口号 */
            struct in_addr sin_addr; /* 32位IP地址 */

          };

          其中 bind 的地址我们使用了一个宏叫 INADDR_ANY

          (xxx.sin_addr.s_addr = htonl(INADDR_ANY);

          关于这个宏的简单介绍

            如果应用程序不关心bind绑定的ip地址,可以使用INADDR_ANY(如果是IPv6,则对应in6addr_any),这样底层的(协议栈)服务会自动选择一个合适的ip地址,这样使在一个有多个网卡机器  上选择ip地址问题变得简单。也就是说 INADDR_ANY 相当于地址 0.0.0.0。 

      参数addrlen:该地址结构的长度。

    返回值:

      成功返回0,失败返回-1

    listen()

    作用:

      如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。其作用就是使已绑定的socket等待监听客户端的连接请求,并设置服务器同时可连接的数量

    头文件:

      #include<sys/socket.h>

    函数原型:

      int listen(int sockfd, int backlog);

    参数说明:

      参数sockfd:即为要监听的socket描述字

      参数backlog:相应socket可以排队的最大连接个数。

    返回值:

      成功返回0,失败返回-1

    accept()

    作用:

      TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
    关键点
    *accept()会创建一个新的socket,并且正是这个新的socket会与执行 connect()的对象socket进行连接。
    返回值:accept()的返回结果是已经连接的socket文件描述符

    头文件:

      #include<sys/socket.h>
    函数原型:

      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回连接connect_fd

    参数说明:

      参数sockfd:服务器socket描述字

      参数sockaddr *addr服务器的地址

      参数addrlen地址长度

    返回值:

      返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,可以把它理解成是一个客户端的socket,这个socket包含的是客户端的ip和port信息。(当然这个new_socket会从sockfd中继承服务器的ip和port信息,两种都有了),而参数中的sockfd包含的是服务器的ip和port信息 。

    close()

    作用:

      在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字
    头文件:

      #include <unistd.h>
    函数原型:

      int close(int fd);

  • 相关阅读:
    python第三十二课——队列
    python第三十二课——栈
    python提示警告InsecureRequestWarning
    关于requests.exceptions.SSLError: HTTPSConnectionPool
    python第三十一课--递归(3.递归的弊端)
    01 redis特点及安装使用
    22 nginx配置与集群
    21-nginx单机1W并发优化
    20-ab压力测试及nginx性能统计模块
    19 大网站的优化思路
  • 原文地址:https://www.cnblogs.com/yxbl/p/12078538.html
Copyright © 2011-2022 走看看