当前位置:网站首页>发送阻塞,接收阻塞
发送阻塞,接收阻塞
2022-07-17 12:07:00 【So_Band】
阻塞
即为数据无法添加或者删除,一直开在此处,直到数据可以添加或者删除的时候;
如果是发送阻塞【send】,即为操作系统内的缓冲区满了,无法继续添加到操作系统内的缓冲区,会阻塞在当下,直到操作系统内的缓冲区有空闲为止;
如果是接收阻塞【recv】,即为操作系统内的缓冲区空了,无法继续获取到操作系统内的缓冲区的数据,会阻塞在当下,直到操作系统内的缓冲区有缓冲数据为止;
示例
服务端
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
int main(int argc, char* argv[])
{
//1.创建一个侦听socket
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1)
{
std::cout << "create listen socket error." << std::endl;
return -1;
}
//2.初始化服务器地址
struct sockaddr_in bindaddr;
bindaddr.sin_family = AF_INET;
bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bindaddr.sin_port = htons(3000);
if (bind(listenfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1)
{
std::cout << "bind listen socket error." << std::endl;
close(listenfd);
return -1;
}
//3.启动侦听
if (listen(listenfd, SOMAXCONN) == -1)
{
std::cout << "listen error." << std::endl;
close(listenfd);
return -1;
}
while (true)
{
struct sockaddr_in clientaddr;
socklen_t clientaddrlen = sizeof(clientaddr);
//4. 接受客户端连接
int clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddrlen);
if (clientfd != -1)
{
//只接受连接,不调用recv收取任何数据
std:: cout << "accept a client connection." << std::endl;
}
}
//7.关闭侦听socket
close(listenfd);
return 0;
}
客户端
/**
* 验证阻塞模式下send函数的行为,client端
* zhangyl 2018.12.17
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#define SERVER_ADDRESS "127.0.0.1"
#define SERVER_PORT 3000
#define SEND_DATA "helloworld"
int main(int argc, char* argv[])
{
//1.创建一个socket
int clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd == -1)
{
std::cout << "create client socket error." << std::endl;
return -1;
}
//2.连接服务器
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
serveraddr.sin_port = htons(SERVER_PORT);
if (connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{
std::cout << "connect socket error." << std::endl;
close(clientfd);
return -1;
}
//3. 不断向服务器发送数据,或者出错退出
int count = 0;
while (true)
{
int ret = send(clientfd, SEND_DATA, strlen(SEND_DATA), 0);
if (ret != strlen(SEND_DATA))
{
std::cout << "send data error." << std::endl;
break;
}
else
{
count ++;
std::cout << "send data successfully, count = " << count << std::endl;
}
}
//5. 关闭socket
close(clientfd);
return 0;
}
最后当客户端的操作系统缓冲区内的数据满的时候,进行阻塞了;
满了之后阻塞,直到数据被recv
参考:
https://codeantenna.com/a/SdTXxsiy6g
边栏推荐
- 2022.07.13 暑假集训 个人排位赛(八)
- 什么是pytest,自动化测试必学
- 机械臂速成小指南(零点五):机械臂相关资源
- R语言使用原生包(基础导入包、graphics)中的plot函数可视化散点图(scatter plot)
- Flink introduction to actual combat - phase IV (time and window diagram)
- Story of status code
- HCIA RIP实验 7.11
- QT学习日记17——Qt数据库
- 2022 Zhejiang secondary vocational group "Cyberspace Security" code information acquisition and analysis (full version)
- 2022年陕西省中职组“网络空间安全”—数据包分析
猜你喜欢
随机推荐
Good news
C语言之构造类型细讲
基于AI智能关联技术的5G网络切片研究与实现
SSH Connection Huawei modelarts Notebook
Software engineering - ranking of majors in Chinese Universities of Software Science
Learning summary of MySQL advanced Chapter 11: locate SQL methods with slow execution and analyze the use of query statement explain
Network Security Learning (Qianfeng network security notes) 1-- building virtual machines
卫星网络中基于时变图的节能资源分配策略
日期——贵州大学考研机试题目
Deadlock, thread and process explanation
HCIA 静态综合实验报告 7.10
FFmpeg录制视频、停止(VB.net,踩坑,类库——10)
SSH连接华为ModelArts notebook
koa2 连接 mysql 数据库实现增删改查操作
喜报
读取二进制文件的中文乱码问题
华为昇思MindSpore详细教程
2022 windows penetration test of "Cyberspace Security" of Hunan secondary vocational group (ultra detailed)
[Download] take you to use FRP to achieve intranet penetration detailed tutorial!
中科磐云——网络空间安全抓包题目 B.pcap