错误发生在服务端异步收到一个socket连接,之后使用WSAGetLastError()得到的IO错误码是122

这个错误码在系统中的解释是The data area passed to a system call is too small.   就是说前面的某个buffer设置的太小,看一下上一个调用的winapi是acceptEx这个函数;下面是代码(这是错误的)

    tRtn = lpfnAcceptEx(
mListenSocket, tpOverlapEx->mCommSocket,
tAcceptRecvBuf, , // 表示只接收连接,不接收数据
sizeof(sockaddr_in), sizeof(sockaddr_in),
&dwBytes, (LPOVERLAPPED)tpOverlapEx);

检查一下tAcceptRecvBuf和overlapEx中的buf,都设置了一K的大小,应该不是这两个buf出现问题的,再看一下acceptEx这个函数在msdn中的原型:

BOOL AcceptEx(
_In_ SOCKET sListenSocket,
_In_ SOCKET sAcceptSocket,
_In_ PVOID lpOutputBuffer,
_In_ DWORD dwReceiveDataLength,
_In_ DWORD dwLocalAddressLength,
_In_ DWORD dwRemoteAddressLength,
_Out_ LPDWORD lpdwBytesReceived,
_In_ LPOVERLAPPED lpOverlapped
);

再看一下msdn上面提供的demo写法

    bRetVal = lpfnAcceptEx(ListenSocket, AcceptSocket, lpOutputBuf,
outBufLen - ((sizeof (sockaddr_in) + ) * ),
sizeof (sockaddr_in) + , sizeof (sockaddr_in) + ,
&dwBytes, &olOverlap);

和我写的代码对比一下,发现问题了,我的代码是

sizeof(sockaddr_in), sizeof(sockaddr_in),

而demo的代码是

sizeof (sockaddr_in) + 16, sizeof (sockaddr_in) + 16,

再看一下msdn对这两个参数的解释

dwLocalAddressLength [in]

The number of bytes reserved for the local address information. This value must be at least 16 bytes more than the maximum address length for the transport protocol in use.

dwRemoteAddressLength [in]

The number of bytes reserved for the remote address information. This value must be at least 16 bytes more than the maximum address length for the transport protocol in use. Cannot be zero.

“要比系统给的最大地址长度至少要多16个字节”,而我的代码没有多这16个字节,问题就出在这里,修改一下,再运行,就没问题了;

话说回来,为什么要多16个字节,这是系统指定的,它没说为什么,蛋疼!

关于这个函数的一些其它知识,可以参考这个连接

http://bbs.csdn.net/topics/60370188

解决SOCKET通信 ERROR_INSUFFICIENT_BUFFER错误的更多相关文章

  1. java centos7 gcc编码 解决socket通信 汉字乱码

    1.把 Java eclipes 设置编码成utf-8 windows->preference->workspace 2.centos7 gcc 默认为utf-8

  2. Delphi 通信报Asynchronous socket error 10053错误的一个解决方法

    在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时, ...

  3. Unity3d socket通信 切换到web版本时报错SecurityException解决办法

    原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...

  4. java的Socket通信例子及关于java.net.SocketException: Socket is closed错误

    今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...

  5. libevent 实现的socket 通信 server以及解决找不到动态库的方法

    注: client 个人觉得没必要用 libvent来实现就没写 注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理 先来说一下 libevent主要是干啥的 : 内部封装了 s ...

  6. day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信

    day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...

  7. Nodejs发送Post请求时出现socket hang up错误的解决办法

    参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...

  8. java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

    原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/k ...

  9. C# Socket系列三 socket通信的封包和拆包

    通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! class Program { static void Main(stri ...

随机推荐

  1. JavaScript: The Good Parts

    Chapter 1 Good Parts: JavaScript is an important language because it is the language of the web brow ...

  2. Java instanceof的进一步理解

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boo ...

  3. R语言合并data.frame

    Merging Data Adding Columns To merge two data frames (datasets) horizontally,  use the merge functio ...

  4. Linux共享库 zlog日志

    [ global] strict init = false buffer min = buffer max = 2MB rotate lock file= /tmp/zlog.lock [format ...

  5. python-s and s.strip()

    s and s.strip()“ 这个表达式的值.Python语法是这么运行的: 如果s is None,那么s会被判断为False.而False不管和什么做and,结果都是False,所以不需要看a ...

  6. android WiFi ASSOC_REJECT 流程跟踪

    Android设备在于AP关联时,如果AP返回关联拒绝帧,Android设别会把AP加入黑名单中. 黑名单中的设备将会在扫描时,延时一段时间放在后面处理. 代码以及log基于SDM450, Andro ...

  7. JAVA对于程序的运行的一种解说

    main方法,正如注释所说,这是程序开始执行的第一行.对于一个Java应用程序来说,main方法是必需的,Java解释器在没有生成任何对象的情况下,以main作为入口来执行程序.每个类中可以定义多个方 ...

  8. 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)

    转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...

  9. 创建自己的PKI公/私密钥对和公钥证书

    1. 创建certificate request configuration file cert_req.conf******************************************* ...

  10. ASP.NET EntityFrameworkCore code first 多对多设计

    摘要:参考网址:https://docs.microsoft.com/zh-cn/ef/core/get-started/full-dotnet/new-db场景:使用ASP.NETEntityFra ...