想到一个socket在多线程模式下,是否可以同时使用的问题,比如socket A阻塞在recv,而别的线程用socket A send是否能成功,下面上实验代码

  1. void thread_socket(int socket)
  2. {
  3. Sleep();
  4. int error = send(socket, "asd", strlen("asd"), );
  5.  
  6. char recData[] = {};
  7. //setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&time, sizeof(int));
  8. int ret = recv(socket, recData, , );
  9. getchar();
  10. }
  11. int main()
  12. {
  13. unsigned short port = ;
  14.  
  15. char ch1[] = { ,,, };
  16. memcpy(ch1, &port, );
  17. string s1;
  18. s1= string(ch1, );
  19. string s("", );
  20. unsigned short unsi = ;
  21. char *ch = ((char*)&unsi);
  22.  
  23. char ccc[] = {};
  24. unsigned short t = *((unsigned short *)(ch));
  25.  
  26. WORD sockVersion = MAKEWORD(, );
  27. WSADATA data;
  28. if (WSAStartup(sockVersion, &data) != )
  29. {
  30. return ;
  31. }
  32. sockaddr_in serAddr;
  33. serAddr.sin_family = AF_INET;
  34. serAddr.sin_port = htons();
  35. inet_pton(AF_INET, "127.0.0.1", &serAddr.sin_addr);
  36.  
  37. while (true)
  38. {
  39. SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  40. if (sclient == INVALID_SOCKET)
  41. {
  42. printf("invalid socket!");
  43. return ;
  44. }
  45. if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
  46. { //连接失败
  47. printf("connect error !");
  48. closesocket(sclient);
  49. return ;
  50. }
  51. send(sclient, "asd", strlen("asd"), );
  52. char recData[];
  53. int nNetTimeout = ;
  54. /*setsockopt(sclient, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));*/
  55.  
  56. int opt_val;
  57. socklen_t opt_len = sizeof(opt_val);
  58. //getsockopt(sclient, IPPROTO_TCP, SO_SNDBUF, (char *)&opt_val, (socklen_t *)&opt_len);
  59.  
  60. std::thread t(thread_socket, sclient);
  61. int i = ;
  62. while (i--)
  63. {
  64. int ret = recv(sclient, recData, , );
  65. if (ret > ) {
  66. recData[ret] = 0x00;
  67. printf(recData);
  68. }
  69. }
  70. closesocket(sclient);
  71. }
  72. WSACleanup();
  73. return ;
  74. }

经过实验发现,socket A阻塞在recv,而别的线程用socket A send是可以成功的。

还有个发现,当一个socket被多出recv时,内核返回时会回调最先调用recv的地方

关于一个socket在阻塞模式下是否还可以使用的实验的更多相关文章

  1. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  2. c++之socket,阻塞模式

    这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept()  ...

  3. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

  4. 非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题

    调试项目代码时,发现了一个奇怪问题,记录如下: 非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象).然后将该socket的写事件进行监听,在写事件触发后,getsocko ...

  5. 看到关于socket非阻塞模式设置方式记录一下。

    关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...

  6. NIO Socket非阻塞模式

    NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...

  7. PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比

    公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把 ...

  8. 阻塞IO下的echo回显实验

    我们只关心代码中的业务逻辑和底层阻塞原因 客户端代码 发送数据 std::string message(len, 'S'); int nw = stream->sendAll(message.c ...

  9. linux socket设置阻塞与非阻塞

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

随机推荐

  1. Windows命令行更改有线本地连接IP地址及DNS的bat脚本

    有些场景需要测试网络通不通等,每次打开网络和共享中心真烦,win10右下角还进不去了,shit! 运行ncpa.cpl也打开那个界面也是费劲吧啦,索性写个bat吧!为啥要写?还不是因为懒!可以把脚本复 ...

  2. Python 解LeetCode:744. Find Smallest Letter Greater Than Target

    思路:二分法,时间复杂度o(logn) class Solution(object): def nextGreatestLetter(self, letters, target): "&qu ...

  3. Java+Tomcat 环境部署

    Java+Tomcat 环境部署 下面在Centos7进行安装Java+Tomcat,网上的很多文章,我在部署中都有些问题,下面是我自己总结的一个安装过程! 安装Java环境 首先,我们先到Java官 ...

  4. SAS学习笔记39 MINOPERATOR | NOMINOPERATOR

    MINOPERATOR(可理解为Macro IN Operator的简写,帮助大家记忆)系统选项用于控制是否在宏程序中是否可以用IN操作符或#操作符,默认值为NOMINOPERATOR.需要注意的是, ...

  5. javascript 写一个ajax 自动拦截,并下载数据

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. tcpdump使用的心得

    这个linux的抓包工具确实用的不多,这段时间由于处理现场的问题所以就需要这个工具,主要是要知道网卡的信息. 命令就是 tcpdump -i 网卡名

  7. (四)resultMap、sql片段与动态SQL

    一.resultMap 1.1 为什么要用resultMap resultType:指定输出结果的类型(pojo.简单类型.hashmap),将SQL查询结果映射为Java对象. 使用resultTy ...

  8. (九)springmvc之json的数据请求(客户端发送json数据到服务端)

    index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...

  9. DotNet跨平台 - docker部署.net core2.0项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  10. 使用ef core自动生成mysql表和数据编码的问题

    mysql默认的编码是不支持中文的,需要改成utf8编码格式. 而我使用的Pomelo.EntityFrameworkCore.MySql组件生成mysql库和表,他是使用默认编码的. 网上大多说修改 ...