思考点
1. socket 绑定了端口和ip ,也就是绑定了一个线程。
1. socket函数 (确定IPv4 tcp/udp 套接字类型 )
1. socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数。
SOCKET PASCAL FAR socket( int af, int type, int protocol);
af:一个地址描述。仅支持AF_INET格式,也就是说ARPA Internet地址格式。
type:新套接口的类型描述。
protocol:套接口所用的协议。如调用者不想指定,可用0指定,表示缺省。‘
1. Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
2. 通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。
3.
2. bind() 函数 sockfd 绑定IP和端口。(本端的)
int bind(int sock, struct sockaddr *addr, socklen_t addrlen); //Linuxsock 为 socket 文件描述符,addr 为 sockaddr 结构体变量的指针,addrlen 为 addr 变量的大小,可由 sizeof() 计算得出
3. connect() 函数(常用于客服端,)
int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen); //Linux参数同 bind()函数,但地址应是服务端地址,也就是要通信的地址(对端)。
4. listen() 函数 (backlog请求队列长度)
- int listen(int sock, int backlog); //Linux
- 当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为请求队列(Request Queue)。
- 如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百。
- 再看函数的返回值,成功返回0, 失败返回-1.
5. accept() 函数
1. 当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
。它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符。新建立的套接字不在监听状态,原来所监听的套接字也不受该系统调用的影响。
2. 参数传入数据的,而是接收数据的,接收的客户端的ip和端口。
3. 返回值sockfd与参数sockfd不一样,参数是监听的服务端sockfd,返回的是新的与客户端连接的sockfd。