通过路由器实现网络层的传输
客户端:
1.socket //电话
2.bind //号码(可选)
3.connect //拨打电话 【面向连接】
--------------------------
4.read/write 【进行通信】
recv / send
5.close
服务器端:
//server
1.socket //电话
2.bind //号码
3.listen //待机(监听) //监听socket
4.accept //接听 【面向连接】
-------------------------
5.read/write 【进行通信】
recv / send
//写
//读
//多任务 (进程/线程)
//任务1:
写
//任务2:
读
5.close
能fflush的是标准io的缓冲区
粘包问题是连续write, 数据粘一起了
0是阻塞, DONTWAIT非阻塞
ssize_t recv(int sockfd, void *buf, size_t len,
int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
为len字节的数据到指定的buff内存中。
参数:sockfd
如果服务器则是accept的返回值的新fd
如果客户端则是socket的返回值旧fd
buff 用来存储数据的本地内存,一般是数组或者
动态内存。
len 要获取的数据长度
flags 获取数据的方式,0 表示阻塞接受。
返回值:成功 表示接受的数据长度,一般小于等于len
失败 -1;
----------------------------------------------------------------------------
int send(int sockfd, const void *msg,
size_t len, int flags);
功能:从msg所在的内存中获取长度为len的数据以flags
方式写入到sockfd对应的套接字中。
参数:sockfd:
如果是服务器则是accept的返回值新fd
如果是客户端则是sockfd的返回值旧fd
msg 要发送的消息
len 要发送的消息长度
flags 消息的发送方式。
返回值:成功 发送的字符长度
失败 -1;
UDP协议:
udp是发一次收一次, tcp是发多次,一次性收