目录
基本数据结构
套接字的普通定义通用的地址结构:
struct sockaddr
structsockaddr {
u_charsa_len;//长度
u_short sa_family;//协议
char sa_data[14];//数据
};
IP专用的地址结构:
struct sockaddr_in
struct sockaddr_in {
u_char sin_len;//长度
u_short sin_family;//协议
u_short sin_port;//端口
struct in_addr sin_addr;//ip地址
char sin_zero[8];//数据
};
结构体in_addr见下图:
表示一个32位的IPv4地址结构:
struct in_addr
structin_addr {
u_longs_addr;
};
TCP服务器端的默认函数调用顺序
int Socket( int domain, int type,int protocol)
功能:创建一个新的套接字,返回套接字描述符
参数说明:
domain:域类型,指明使用的协议栈,如TCP/IP使用的是 PF_INET ,其他还有AF_INET6、AF_UNIX
type:指明需要的服务类型, 如
SOCK_DGRAM:数据报服务,UDP协议
SOCK_STREAM:流服务,TCP协议
protocol:一般都取0(由系统根据服务类型选择默认的协议)
int bind(int sockfd,struct sockaddr* my_addr,int addrlen)
功能:为套接字指明一个本地端点地址
TCP/IP协议使用sockaddr_in结构,包含IP地址和端口号,服务器使用它来指明熟知的端口号,然后等待连接
参数说明:
sockfd:套接字描述符,指明创建连接的套接字
my_addr:本地地址,IP地址和端口号
addrlen:地址长度
套接口中port=0表示由内核指定端口号,设定sin_addr为INADDR_ANY,由内核指定IP地址。
int listen(int sockfd,intinput_queue_size)
功能:
面向连接的套接字使用它将一个套接字置为被动模式,并准备接收传入连接。用于服务器,指明某个套接字连接是被动的
参数说明:
Sockfd:套接字描述符,指明创建连接的套接字
input_queue_size:该套接字使用的队列长度,指定在请求队列中允许的最大请求数
int accept(int sockfd, structsockaddr *addr, int *addrlen)
功能:获取传入连接请求,返回新的连接的套接字描述符。
为每个新的连接请求创建了一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套接字接收其他的连接请求。新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。
参数说明:
Sockfd:套接字描述符,指明正在监听的套接字
addr:提出连接请求的主机地址
addrlen:地址长度
int send(int sockfd, const void * data, int data_len, unsigned int flags)
功能:
在TCP连接上发送数据,返回成功传送数据的长度,出错时返回-1。send会将外发数据复制到OS内核中,也可以使用send发送面向连接的UDP报文。
参数说明:
sockfd:套接字描述符
data:指向要发送数据的指针
data_len:数据长度
flags:通常为0
如果send()函数的返回值小于len的话,则你需要再次发送剩下的数据。802.3,MTU为1492B,如果包小于1K,那么send()一般都会一次发送光的。