Linux网络编程——详解SOCKET( 二 )


就是通过IP+端口号进行匹配 , 匹配之后可以通过socket进行数据的发送和接收(socket本质是文件描述符fd)
Linux网络编程——详解SOCKET文章插图
具体的流程如下
Linux网络编程——详解SOCKET文章插图
socket创建#include#include int socket(int domain, int type, int protocol);

  • domain:AF_INET 这是大多数用来产生socket的协议 , 使用TCP或UDP来传输 , 用IPv4的地址AF_INET6 与上面类似 , 不过是采用IPv6的地址AF_UNIX 本地协议 , 使用在Unix和Linux系统上 , 一般都是当客户端和服务器在同一台及其上的时候使用
  • type:(1)SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接 。 这是一个使用最多的socket类型 , 这个socket是使用TCP来进行传输 。 (2)SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用 。 该协议是不可靠的 , 使用UDP来进行它的连接 。 (3)SOCK_SEQPACKET 这个协议是双线路的、可靠的连接 , 发送固定长度的数据包进行传输 。 必须把这个包完整的接受才能进行读取 。 (4)SOCK_RAW 这个socket类型提供单一的网络访问 , 这个socket类型使用ICMP公共协议 。 (ping、traceroute使用该协议)(5)SOCK_RDM 这个类型是很少使用的 , 在大部分的操作系统上没有实现 , 它是提供给数据链路层使用 , 不保证数据包的顺序
  • protocol:0 默认协议
  • 返回值:成功返回一个新的文件描述符(也叫监听套接字) , 失败返回-1
bind绑定
  • 在创建了套接字之后需要IP和端口号和套接字绑定在一起( IP地址:在网络环境中 , 唯一标识一台主机 , 端口号:在主机中唯一标识一个进程)
  • 前面讲过 , struct sockaddr *是一个通用指针类型 , addr参数实际上可以接受多种协议的sockaddr结构体 , 而它们的长度各不相同 , 所以需要第三个参数addrlen指定结构体的长度
#include #include int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:socket文件描述符
  • addr:构造出IP地址加端口号
  • addrlen:sizeof(addr)长度
  • 返回值:成功返回0 , 失败返回-1, 设置errno
例如
struct sockaddr_in servaddr;bzero(//清0结构体servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(8000);listen
  • 创建了套接字之后通常需要等待客户端的连接,此时可以使用listen函数将该套接字转换为倾听套接字 。
  • 可以指定同时连接的最大客户端数量
  • 若达到数量上限 , 新客户端等待其它已链接的客户端链接结束
#include #include int listen(int sockfd, int backlog);
  • sockfd:socket文件描述符
  • backlog:排队建立3次握手队列和刚刚建立3次握手队列的连接数和
  • 返回值:成功返回0 , 失败返回-1
accept
  • 当服务器倾听到一个连接之后 , 可以使用函数accept从倾听套接字的完成连接队列中接收一个连接 , 如果这个完成连接队列为空 , 则会使得这个进程进入睡眠状态
#include/* See NOTES */#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockdf:socket文件描述符
  • addr:传出参数 , 返回链接客户端地址信息 , 含IP地址和端口号
  • addrlen:传入传出参数,传入sizeof(addr)大小 , 函数返回时返回真正接收到地址结构体的大小
  • 返回值:成功返回一个新的socket文件描述符 , 用于和客户端通信 , 失败返回-1 , 设置errno
connect客户端连接函数
  • 客户端需要调用connect()连接服务器 , connect和bind的参数形式一致 , 区别在于bind的参数是自己的地址 , 而connect的参数是对方的地址
#include#include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockdf:socket文件描述符
  • addr:传入参数 , 指定服务器端地址信息 , 含IP地址和端口号
  • addrlen:传入参数,传入sizeof(addr)大小
  • 返回值:成功返回0 , 失败返回-1 , 设置errno
读写函数【Linux网络编程——详解SOCKET】int read(int fd, char *buf, int len);int write(int fd, char *buf, int len);
  • fd套接字描述符;
  • buf指定数据缓冲区;
  • len指定接收或发送的数据量大小(以字节为单位) 。
  • 返回值返回读/写成功的数据量大小 , 失败则返回-1 。
关闭函数int close(int fd);