基于TCP的socket详解
socket()
#include <sys/socket.h>
int socket( int af, int type, int protocol);
af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。
type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
protocol:顾名思义,就是指定协议。套接口所用的协议。如调用者不想指定,可用0。常用的协议有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
执行socket()建立空的sockfd
bzero()
原型:extern void bzero(void *s, int n);
参数说明:s 要置零的数据的起始地址; n 要置零的数据字节个数。
用法:#include <string.h>
功能:置字节字符串s的前n个字节为零且包括‘\0’。
bind()
将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
参数列表中,sockfd 表示已经建立的socket编号(描述符);
my_addr 是一个指向sockaddr结构体类型的指针;
参数addrlen表示my_addr结构的长度,可以用sizeof操作符获得。
通过bind()给socdfd建立三元组
listen()
创建一个套接口并监听申请的连接.
#include <sys/socket.h>
int listen( int sockfd, int backlog);
sockfd:用于标识一个已捆绑未连接套接口的描述字。
backlog:等待连接队列的最大长度。
通过listen()给sockfd建立监听窗口
accept()函数将响应连接请求,建立连接
int accept( int sockfd , struct sockaddr *addr , int *addrlen);
accept缺省是阻塞函数,阻塞直到有连接请求
sockfd: 被动(倾听)的socket描述符
如果成功,返回一个新的socket描述符(connected socket descriptor)来描述该连接。这个连接用来与特定的Client交换信息
sockfd:该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。
addr参数的实际格式由套接口创建时所产生的地址族确定。
addr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
通过accept() 给socket建立完整的五元组
connect()
connect: initiate a connection on a socket (connect to a server).
int connect(int sockfd, struct sockaddr *servaddr, int addrlen);
主动的socket,通过这个连接来与Server交换信息
servaddr是事先填写好的结构,Server的IP和端口都在该数据结构中指定
send/recv (用于TCP:客户端与服务器之家的数据交换)
int send(int s, const void *msg, size_t len, int flag);
s:发送数据的套接口文件描述符。
msg:发送的数据的指针
len:数据的字节长度
flag:标志设置为0。
int recv(int s, void *buf, size_t len, int flag);
s:读取的套接口文件描述符。
buf:保存读入信息的地址。
len:缓冲区的最大长度。
flag:设置为0。
close()
int close(int sockfd);
shutdown()
int shutdown(int sockfd, int how);
how: SHUT_RD, SHUT_WR, SHUT_RDWR
shutdown直接对TCP连接进行操作,close只是对套接字描述符操作。
server 和 client 可以互相发送接收数据
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度