当前位置:网站首页>发送阻塞,接收阻塞
发送阻塞,接收阻塞
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
边栏推荐
- idea展示服务端口--service
- 机械臂速成小指南(十三):关节空间轨迹规划
- Simulation Research on optimal detection of fault data in communication network
- Scala 基础 (三):运算符和流程控制
- koa2 连接 mysql 数据库实现增删改查操作
- How to save and exit VIM
- 空天地海协同应用综述
- Quick completion guide of manipulator (zero five): resources related to manipulator
- HCIA 复习作答 2022.7.6
- Aller à l'école = gagner de l'argent? L'Académie des fées sans frais de scolarité!
猜你喜欢
随机推荐
Go to school = earn money? Immortal college without paying tuition fees!
mysql5.6 alter语句
笔记本键盘失灵解决办法
Blender digital twin production tutorial
FreeRTOS个人笔记-临界值的保护
2022年湖南省中职组“网络空间安全”赛题解析(超详细)
Overview of 6G oriented smart reflector wireless communication
GIS数据漫谈(三)
[Mori city] random talk on GIS data (IV) - coordinate system
string类的介绍及模拟实现
ash: /etc/apt/sources. List: insufficient permissions
B. AccurateLee【双指针】【substr函数】
ty_ Gr551x code framework
【排序】归并排序
Analysis of Web Remote Code Execution Vulnerability of Zhongke panyun-d module
基于 koa2 + mysql 实现用户管理的 CRUD 代码实践
English grammar_ Personal pronoun usage
上学=挣钱?无需缴纳学费的神仙院校!
Online education knowledge payment website source code system + live broadcast + applet, installation tutorial
卫星网络中基于时变图的节能资源分配策略









