首先了解下数据在client与server端的通信中的收发过程
考虑单向的数据流,即
即A(客户端)向B(服务端)发送数据。 在ProgramA中,定义一个数组char buf[100] = "tcp" ;那么buf就是应用程序缓冲区,即图中A对应的圆内存,send / write函数对应上面蓝色的socket API,内核缓冲区对应黄色方形部分。可知,send的作用就是把应用程序缓冲区的数据拷贝到内核缓冲区而已。内核缓冲区的数据经过网卡,历经网络传到B端的网卡(TCP协议),然后进入B的内核缓冲区,再通过recv / read 函数剪切/复制到B的应用程序缓冲区。
客户端与服务器端都会通过socket生产一个套接字描述符fd;
实际上
1.首先知道,套接字描述符是用来标定系统为当前的进程划分的一块缓冲空间的,类似于文件描述符,不过二者有些区别;
2.其次应该知道的是,这块缓冲空间并不是一开始就被系统划分给进程的;
3. 对于 server 端而言,划分系统缓冲空间的时刻是: 当server 决定接收来自 client 的连接请求,
即 accept 方法成功执行,返回一个 > 0 的整数(也就是新的套接字描述符newfd),这个套接字指向的缓冲区包含read缓冲区和write缓冲区
系统才会为其分配缓冲空间,自然, 这块缓冲空间是通过 accept 新的套接字描述符来指定的 ;
4. 对于 client 端而言,划分系统缓冲空间的时刻是: 当 client 端执行 connect 函数正确的时候,
connect 函数正确执行,说明此 client 端的连接请求已经被 server 端接收,剩下的就需要系统为 client 划分缓冲空间,
用来接收来自于 server 端的返回结果。 这个时候,系统才会为其分配缓冲空间,
而该缓冲空间使用 client 一开始创建套接字的 socket 函数的返回值标定即可。这个套接字指向的缓冲区包含read缓冲区和write缓冲区
————————————————
由上可知:
每一端都会通过socket生成属于自己的套接字描述符fd,用来标定系统为当前进程划分的缓冲空间,通过缓冲空间可以收发数据,对fd进行操作缓冲空间就像对文件进行操作一样,使用read、write、send、recvfrom等函数进行数据收发读写,并且可以通过bind、listen、setsockopt等函数对其进行属性的设置。
————————————————
图文转自: