socket10055错误问题求教

beiguofengguang 2009-05-25 01:05:44
socket通信处理流程如下:
1 需要通信时调用一函数f1;
2 函数f1里起一个发送和接收用的线程,线程resume后在函数里循环等待线程结束,然后处理接收到的信息;
3 线程执行时做如下处理:
创建: socket1=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
设置超时: setsockopt(socket1, SOL_SOCKET, SO_RCVTIMEO, @Time,sizeof(TimeOut));
连接:li := connect(socket1, sa_in_svr, sizeof(sockaddr_in));
发送数据:send(socket1, (pchar(infostr))^,Length(infostr), 0);
循环接收数据:
repeat
ret := recv(socket1, Buffer, sizeof(Buffer) - 1, 0);
//这里进行接收后的一些处理
until ret = 0;
关闭连接:closesocket(ClientSocket);

现在出现的现象时,当多次与服务器通信时,有的成功,有的失败,失败原因都是在connect时报10055错误,无法将报文发送给服务器。成功与失败交叉出现。
不知道问题出在那里。希望知道的给指点下,谢谢了!
...全文
768 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
beiguofengguang 2009-07-03
  • 打赏
  • 举报
回复
电脑中毒导致,病毒创建了大量的TCP/IP连接,估计是导致系统资源耗尽了
谢谢大家的参与
张志峰 2009-06-01
  • 打赏
  • 举报
回复
缓冲区溢出,看看你设的数组那是否有问题
KEFU 2009-06-01
  • 打赏
  • 举报
回复
不分析你是如何产生的这个错误了,我把我曾经遇到这个错误的情况告诉你,仅供参考:
环境,我写通讯都是VC下异步方式的:
第一种:缓冲区越界,是自己没有分配好内存,或者在异步没有返回之前释放了一部分缓冲区。
第二种:异步接收时,WSARECV,接收字节直接传入了NULL值,按理说这个是可以的,但是也会导致随机的10055错误。
建议Delphi所有使用地址的地方好好检查一遍,包含setsockopt的选项值,接收、发送缓冲区,buffer如果是数组的话,注意静态和动态数组的区别。如果并发量大的话,建议内存管理使用Fast4MM(曾经发现在使用内置的内存管理,出现随机的AV错误)
beiguofengguang 2009-06-01
  • 打赏
  • 举报
回复
我在出问题的机子上试了,间隔1S或5S去循环创建SOCKET,然后设置超时,然后连接,然后关闭,并不执行发送、接收的动作,仍然会报10055错误。所以我想应该不是缓冲区的问题。
beiguofengguang 2009-05-31
  • 打赏
  • 举报
回复
提前
beiguofengguang 2009-05-31
  • 打赏
  • 举报
回复
自己顶下,别沉太快了呀
beiguofengguang 2009-05-31
  • 打赏
  • 举报
回复
急等高手来指点下.
另外照以上步骤写了个小测试程序,不停的进行间隔创建Socket、连接服务器、断开连接操作,发现有的地区终端都很正常,而有些地区的终端就很频繁的在连接时报10055错误。这种现象是不是网络不稳定导致的?
beiguofengguang 2009-05-26
  • 打赏
  • 举报
回复
另外如果是缓冲区满我要怎么操作才能清空缓冲区?
或者把缓冲区设置大点能不能避免出现这样的问题?多大才合适?我发送接收的数据都不太大.操作也不是特别频繁
beiguofengguang 2009-05-26
  • 打赏
  • 举报
回复
我的每个与服务器的交互都至少会间隔10S左右,这么长时间缓冲区还不会释放掉么?
而且服务器返回的信息我都在线程里接收完了.如果是缓冲区满了的话也应该是在发送信息或接收信息的时候报10055错误,但现在是在连接的时候报的.
请大家再讨论讨论
shuihan20e 2009-05-26
  • 打赏
  • 举报
回复
WSAENOBUFS

(10055)

No buffer space available.

An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.


你的接收缓冲满了,新的数据进不来。
jmh521 2009-05-26
  • 打赏
  • 举报
回复
学习了...
KEFU 2009-05-25
  • 打赏
  • 举报
回复
按理说,你是buffer越界了或者没有分配,请关注buffer的内存分配和使用。
beiguofengguang 2009-05-25
  • 打赏
  • 举报
回复
没人给指点下么?自己顶下,别沉了

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧