创建一个简单服务器用到的基本函数

一,socket()
头文件:#include <sys/socket.h>
函数原型:int socket(int domain, int type, int protocol);
作用:创建套接字。

参数domain:指定使用何种的地址类型。默认AF_INET。
eg:
AF_INET IPv4网络通信
AF_INET6 IPv6网络通信
AF_PACKET 链路层通信
AF_UNIX, AF_LOCAL 本地通信

参数type:套接字类型。默认SOCK_STREAM。
eg:
1、SOCK_STREAM 提供双向连续且可信赖的数据流, 即TCP. 支持 OOB 机制, 在所有数据传送前必须使用connect()来建立连线状态
2、SOCK_DGRAM 使用不连续不可信赖的数据包连接,基于UDP
3、SOCK_SEQPACKET 提供连续可信赖的数据包连接
4、SOCK_RAW 提供原始网络协议存取
5、SOCK_RDM 提供可信赖的数据包连接
6、SOCK_PACKET 提供和网络驱动程序直接通信. protocol 用来指定socket 所使用的传输协议编号, 通常此参考不用管它, 设为0 即可

参数protocol:协议号。可设置为0,表示选择当前family和type组合下protocol的系统默认值
eg:
IPPROTO_TCP IPPTOTO_UDP IPPROTO_SCTP IPPROTO_TIPCTCP
TCP传输协议 UDP传输协议 STCP传输协议 TIPC传输协议

二,bind()
头文件:#include<sys/socket.h>
函数原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:把一个地址族中的特定地址赋给socket。

参数sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。

参数addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同。
IPV4:
struct in_addr

{

uint32_t s_addr; /* 32位IPv4地址 */
};

struct sockaddr_in
{
sa_family_t sin_family; /* //地址族 */

in_port_t sin_port; /* 16位TCP/UDP端口号 */
struct in_addr sin_addr; /* 32位IP地址 */

};


参数addrlen:该地址结构的长度。


三,listen()
头文件:#include<sys/socket.h>
函数原型:int listen(int sockfd, int backlog);
作用:如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

参数sockfd:即为要监听的socket描述字

参数backlog:相应socket可以排队的最大连接个数。

四,connect()
头文件:#include<sys/socket.h>
函数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:将套接字连接到目的地址,客户端通过调用connect函数来建立与TCP服务器的连接。

参数sockfd:为客户端的socket描述字

参数addr:为服务器的socket地址

参数addrlen:为socket地址的长度

五,accept()
头文件:#include<sys/socket.h>
函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回连接connect_fd
作用:TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
关键点
*accept()会创建一个新的socket,并且正是这个新的socket会与执行connect()的对象socket进行连接。
返回值:accept()的返回结果是已经连接的socket文件描述符


六,close()
头文件:#include <unistd.h>
函数原型:int close(int fd);
作用:在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字

猜你喜欢

转载自www.cnblogs.com/yxbl/p/12078538.html
今日推荐