socket编程

目录
1、基于TCP的socket程序函数调用过程
2、基于UDP的socket函数调用过程
3、如何服务更多项目?

TCP建立Socket时,需要先准备AF_INET4/6和SOCK_STREAM / SOCK_DGRAM参数,设置TCP连接的IPV网络和传输方式(流传输或包传输)

1、客户端和服务器都需要先调用socket()函数。

图示:


image.png

内核为每个socket()维护两个队列,一个是已连接队列(establish状态),一个是三次握手还没完成的队列(syn_rcvd状态)。
服务端的bind()函数绑定IP和PORT,然后开始监听listen();监听socket和真正用来传输的socket()是两个,一个叫做监听socket(),一个叫做已连接socket();accpet()对应的是已连接socket()。

2、UDP不需要连接和三次握手,因此不需要调用listen()和connect();

image.png

客户端和服务器都需要调用bind(),没有连接的UDP需要sendto()和recvfrom(),用于每次通信时传入IP地址和端口。

3、TCP最大连接数=客户端IP(2^32) x 客户端端口数(2^16)

由于文件描述符和内存限制,一般远不能达到最大上限;
因此有4种方式增多处理进程规模:
1)多进程方式(将项目外包给其他公司):fork
2)多线程方式(将项目转包给独立的项目组):pthread_create,文件描述符和内存是共享的,多了一个引用
3)IO多路复用,一个线程维护多个socket(一个项目组支撑多个项目):fd_set,是文件描述符集合,类似项目进度墙,用select()轮询
4)IO多路复用,从“派人盯着”到“有事通知”:使用epoll() 替代 select() ,随时call back通知。
被称为解决C10K问题的利器。

你可能感兴趣的:(socket编程)