最近在看UNP的基本TCP套接字编程这一章,现总结如下:
首先用一张图阐述一下基本TCP socket的C/S框架
(1)socket函数
#include<sys/socket.h>
int socket(int family,int type,int protocol)
函数说明:
用于创建一个套接字
参数说明:family制定协议族,该参数也被称作协议域。具体常值如下表:
family | 说明 |
AF_INET | IPv4协议 |
AF_INET6 | IPv6协议 |
AF_LOCAL | Unix域协议 |
AF_ROUTE | 路由套接字 |
AF_KEY | 密钥套接字 |
type | 说明 |
SOCK_STREAM | 字节流套接字 |
SOCK_DGRAM | 数据报套接字 |
SOCK_SEQPACKET | 有序分组套接字 |
SOCK_RAW | 原始套接字 |
protocol | 说明 |
IPPROTO_TCP | TCP传输协议 |
IPPROTO_UDP | UDP传输协议 |
IPPROTO_SCTP | SCTP传输协议 |
返回值:
socket函数成功时,返回一个被称为套接字描述符(socket descriptor)的小的非负整数,其也被简称为sockfd;失败返回-1
(2)connect函数
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *servaddr,socklen_t addrlen)
函数说明:
用于与TCP服务器建立连接,调用connect函数将激发三次握手。connect函数导致当前套接字从CLOSED状态转移到SYN_SENT状态,若成功再转移到ESTABLISHED状态。若connect失败必须close当前套接字并重新调用socket
参数说明:
sockfd是socket函数返回的套接字描述符
servaddr是一个指向套接字地址结构的指针
addrlen指定套接字地址结构的大小
返回值:
若成功为0,出错则为-1
(3)bind函数
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen)
函数说明:
bind函数将一个本地协议地址赋予一个套接字。对于网际网协议,协议地址是32位的IPv4地址或128位IPv6地址与16位TCP或UDP端口号的组合。
调用bind可以指定IP地址或端口号,可以根据下表设置sin_addr和sin_port或sin6_addr和sin6_port
IP地址 | 端口 | 结果 |
通配地址 | 0 | 内核选择IP地址和端口 |
通配地址 | 非0 | 内核选择IP地址,进程指定端口 |
本地IP地址 | 0 | 进程指定IP地址,内核选择端口 |
本地IP地址 | 非0 | 进程指定IP地址和端口 |
struct sockaddr_in servaddr;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
参数说明:
sockfd是socket函数返回的套接字描述符
myaddr是一个指向套接字地址结构的指针
addrlen指定套接字地址结构的大小
返回值:
成功返回0,出错-1