在1.1节中我们介绍了基本的网络基础,现在我们来介绍一下已经为我们编程使用的函数:
1.socket() --得到文件描述符
首先要使用这个函数是需要添加头文件<sys/types.h>和<sys/socket.h>的。其原型为:
int socket(int domain,int type,int protocol);
参数介绍:
(1)domain一般设置成"AF_INET",就如前节数据结构struct sockaddr中的一样。
(2)type是确定是数据流式还是数据报式,即SOCK_STREAM类型或SOCK_DGRAM类型。
(3)protocol一般设置为"0"。
返回:
socekt()只是返回在系统调用中可能用到的socket描述符,或者在错误的时候返回-1。全局变量errno中存储错误值。
2.bind() --在哪个端口
一旦得到了套接口,可能就需要将套接口和机器上的一定的端口绑定起来。
首先要使用这个函数是需要添加头文件<sys/types.h>和<sys/socket.h>的。其原型为:
int bind(int sockfd,struct sockaddr *my_addr,int addrlen);
参数介绍:
(1)sockfd是调用socket返回的文件描述符。
(2)my_addr是指向数据结构struct sockaddr的指针,它保存地址(即端口和IP地址)信息。
(3)addrlen设置为sizeof(struct sockaddr)。
bind()在错误的时候是返回-1,并且设置全局变量errno。
3.connect() --HELLO
这个函数一般只是在客户端中运用,即需要去连接那个主机的哪个端口,一般不用需要分配本机端口。
首先要使用这个函数是需要添加头文件<sys/types.h>和<sys/socket.h>的。其原型为:
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);
参数介绍:
(1)sockfd是调用socket返回的文件描述符。
(2)serv_addr是指向数据结构struct sockaddr的指针,它保存目的地(即端口和IP地址)信息。
(3)addrlen设置为sizeof(struct sockaddr)。
connect()错误的时候返回-1,并且设置全局变量errno。
4.listen() --will somebody please call me.
处理过程分为两步:首先,你听--listen(),然后,你接受--accept()。
首先要使用这个函数是需要添加头文件<sys/types.h>和<sys/socket.h>的。其原型为:
int listen(int sockfd,int backlog);
参数介绍:
(1)sockfd是调用socket返回的文件描述符。
(2)backlog是进入队列中允许的连接数目。这个具体是什么意思呢,其实就是进入的连接是在队列中一直等待直到你接受accept的连接。它们的数目限制于队列的允许。大多数系统的允许数目为20,当然也可以设置为5到10。
listen()错误的时候返回-1,并且设置全局变量errno。
5.accept() --Thank you for calling port 4000.
我们可以这样来理解accept,假如有人从很远的地方通过一个你在侦听listen()的端口连接connect()到你的机器。他的连接将加入到等待接受accept()的队列中。你调用accept()告诉他你有空闲的连接。他将返回一个新的套接口文件描述符,原来的一个还在侦听你的那个端口,新的最后在准备发送send()和接受recv()数据。就是这样一个简单的过程。
首先要使用这个函数是需要添加头文件<sys/types.h>和<sys/socket.h>的。其原型为:
int accept(int sockfd,void *addr,int *addrlen);
参数介绍:
(1)sockfd是调用socket返回的文件描述符。
(2)addr是个指向局部的数据结构struct sockaddr_in的指针。
(3)addrlen是一个局部整形变量,一般设置为sizeof(struct sockaddr_in)。
accept()在错误的时候返回-1,并且设置全局变量errno。