创建一个简单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);

原文地址:https://www.cnblogs.com/yxbl/p/12078538.html