关于一个socket在阻塞模式下是否还可以使用的实验
想到一个socket在多线程模式下,是否可以同时使用的问题,比如socket A阻塞在recv,而别的线程用socket A send是否能成功,下面上实验代码
- void thread_socket(int socket)
- {
- Sleep();
- int error = send(socket, "asd", strlen("asd"), );
- char recData[] = {};
- //setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&time, sizeof(int));
- int ret = recv(socket, recData, , );
- getchar();
- }
- int main()
- {
- unsigned short port = ;
- char ch1[] = { ,,, };
- memcpy(ch1, &port, );
- string s1;
- s1= string(ch1, );
- string s("", );
- unsigned short unsi = ;
- char *ch = ((char*)&unsi);
- char ccc[] = {};
- unsigned short t = *((unsigned short *)(ch));
- WORD sockVersion = MAKEWORD(, );
- WSADATA data;
- if (WSAStartup(sockVersion, &data) != )
- {
- return ;
- }
- sockaddr_in serAddr;
- serAddr.sin_family = AF_INET;
- serAddr.sin_port = htons();
- inet_pton(AF_INET, "127.0.0.1", &serAddr.sin_addr);
- while (true)
- {
- SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sclient == INVALID_SOCKET)
- {
- printf("invalid socket!");
- return ;
- }
- if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
- { //连接失败
- printf("connect error !");
- closesocket(sclient);
- return ;
- }
- send(sclient, "asd", strlen("asd"), );
- char recData[];
- int nNetTimeout = ;
- /*setsockopt(sclient, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));*/
- int opt_val;
- socklen_t opt_len = sizeof(opt_val);
- //getsockopt(sclient, IPPROTO_TCP, SO_SNDBUF, (char *)&opt_val, (socklen_t *)&opt_len);
- std::thread t(thread_socket, sclient);
- int i = ;
- while (i--)
- {
- int ret = recv(sclient, recData, , );
- if (ret > ) {
- recData[ret] = 0x00;
- printf(recData);
- }
- }
- closesocket(sclient);
- }
- WSACleanup();
- return ;
- }
经过实验发现,socket A阻塞在recv,而别的线程用socket A send是可以成功的。
还有个发现,当一个socket被多出recv时,内核返回时会回调最先调用recv的地方
关于一个socket在阻塞模式下是否还可以使用的实验的更多相关文章
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- c++之socket,阻塞模式
这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept() ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- 非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题
调试项目代码时,发现了一个奇怪问题,记录如下: 非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象).然后将该socket的写事件进行监听,在写事件触发后,getsocko ...
- 看到关于socket非阻塞模式设置方式记录一下。
关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...
- NIO Socket非阻塞模式
NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...
- PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比
公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把 ...
- 阻塞IO下的echo回显实验
我们只关心代码中的业务逻辑和底层阻塞原因 客户端代码 发送数据 std::string message(len, 'S'); int nw = stream->sendAll(message.c ...
- linux socket设置阻塞与非阻塞
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式 ...
随机推荐
- Windows命令行更改有线本地连接IP地址及DNS的bat脚本
有些场景需要测试网络通不通等,每次打开网络和共享中心真烦,win10右下角还进不去了,shit! 运行ncpa.cpl也打开那个界面也是费劲吧啦,索性写个bat吧!为啥要写?还不是因为懒!可以把脚本复 ...
- Python 解LeetCode:744. Find Smallest Letter Greater Than Target
思路:二分法,时间复杂度o(logn) class Solution(object): def nextGreatestLetter(self, letters, target): "&qu ...
- Java+Tomcat 环境部署
Java+Tomcat 环境部署 下面在Centos7进行安装Java+Tomcat,网上的很多文章,我在部署中都有些问题,下面是我自己总结的一个安装过程! 安装Java环境 首先,我们先到Java官 ...
- SAS学习笔记39 MINOPERATOR | NOMINOPERATOR
MINOPERATOR(可理解为Macro IN Operator的简写,帮助大家记忆)系统选项用于控制是否在宏程序中是否可以用IN操作符或#操作符,默认值为NOMINOPERATOR.需要注意的是, ...
- javascript 写一个ajax 自动拦截,并下载数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- tcpdump使用的心得
这个linux的抓包工具确实用的不多,这段时间由于处理现场的问题所以就需要这个工具,主要是要知道网卡的信息. 命令就是 tcpdump -i 网卡名
- (四)resultMap、sql片段与动态SQL
一.resultMap 1.1 为什么要用resultMap resultType:指定输出结果的类型(pojo.简单类型.hashmap),将SQL查询结果映射为Java对象. 使用resultTy ...
- (九)springmvc之json的数据请求(客户端发送json数据到服务端)
index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...
- DotNet跨平台 - docker部署.net core2.0项目
参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...
- 使用ef core自动生成mysql表和数据编码的问题
mysql默认的编码是不支持中文的,需要改成utf8编码格式. 而我使用的Pomelo.EntityFrameworkCore.MySql组件生成mysql库和表,他是使用默认编码的. 网上大多说修改 ...