Linux系统编程下的套接字socket编程函数


套接字:他是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。

它是网络进程的ID。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

创建一个套接字:int socket(int domain,int type,int protocol);

第一个参数:协议族,分为两种IPv4和IPv6。IPv4用AF_INET,IPv6用AF_INET6,通常使用IPv4\

第二个参数:套接字类型。分为TCP和UDP两种类型,TCP协议用字节流套接字(SOCK_STREAM),

UDP协议用数据报套接字(SOCK_DGRAM)。

第三个参数:协议控制,通常为0. 以选择的协议族和套接字类型组合的系统默认值。


返回值:失败返回-1,成功返回一个套接字文件描述符。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


连接服务器:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

第一个参数:连接服务器的套接字文件描述符,一般使用在客户端,为通信套接字


第二个参数:要连接的服务器地址结构体,类型为通用地址结构体,需要强转。

为了配置方便,使用IPv4的地址结构类型sockaddr_in定义一个地址信息变量,

例如sockaddr_in  info; info.sin_family = AF_INET; info.sin_port = htons(端口号);

info.sin_addr.s_addr = inet_addr(ip地址,且为字符串)。

&info放在第二个参数,使套接字和地址信息绑定起来。

第三个参数:一般使用sizeof(sockaddr_in),传入地址结构的长度。


返回值:失败返回-1,成功返回0.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


绑定套接字函数:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

第一个参数:要绑定的套接字文件描述符


第二个参数:要绑定的地址信息结构体,该函数通常用于服务器,并且绑定服务器自身的IP端口信息。


第三个参数:地址长度信息长度,通常为sizeof(sockaddr)。


返回值:成功返回0,失败返回-1.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


监听套接字函数:int listen(int sockfd, int backlog);


第一个参数:执行监听的套接字文件描述符

第二个参数:监听的最大队列(客户端同时连接的上限)

返回值:成功返回0,失败返回-1.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


等待客户端连接:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


第一个参数:执行等待的监听套接字。


第二个参数:需要新定义一个地址信息结构体,等待到客户端连接后,客户端的地址信息会回写到该参数,

最好初始化为0;

第三个参数:地址信息的长度,因为参数要求指针,所以要定义socklen_t类型的一个变量,并且取地址传进去。


返回值:等待到客户端连接后,会返回一个通信套接字,用于和客户端通信用, 失败则返回-1。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


关闭套接字:close(fd)

这个就不多说了。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


再提一下IO复用:

当程序处于单进程单线程时,想实现既能等待客户端连接,又能接受其他输入并处理,就需要IO复用了

int select(int maxfdpl,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)

第一个参数为检查的最大队列数,这样就不用全部检测,该函数可以管理1024个IO口,用32个32位的整形数组来管理,

一个位管理一个描述符。设置最大队列数就可以节省时间,不用全部检测。


第二个参数:选择让内核检测读

第三个参数:选择让内核检测写

第四个参数:选择让内核检测异常


第五个参数:可以选择三种模式,永远等(设置空指针)、等待固定时间(设置秒数和微秒数)

、根本不等待(设置为0)。


还有一套配套的函数:用于设置监听的队列

void FD_ZERO(fd_set  *fdset) 清除所有监听的位

void FD_SET(int fd , fd_set  *fdset) 设置要监听的位

void FD_CLR(int fd , fd_set  *fdset) 关闭监听位,取消监听

int FD_ISSET(int fd , fd_set *fdset) 检测哪个位被触发,从而执行相应操作


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(Linux系统编程下的套接字socket编程函数)