关于使用winsock中的一个问题,希望各位高手指点

suzhaohe99 2000-07-13 03:22:00
我用winsocket控件来完成服务器和客户端的通讯,如果客户端发送请求的速度不是很快的话,服务器所做的事情一切正常,但我做压力测试时(用一个循环无间断的发送请求), 则在Error事件中会出现10035的错误

通讯失败,错误码:10035
错误信息:Socket is non-blocking and the specified operation will block

我的代码的基本思路是:
来一个请求,就用一个新的winsock去accept

我不知道这是因为什么,请各位指教
...全文
165 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphafox 2000-07-14
  • 打赏
  • 举报
回复
你得让出端口!
我想你既然用控件数组,那么所有的SOCK的LOCALPORT是一样的。在SOCK(0)侦听到连接请求后必须CLOSE以便让出端口,同样在其他SOCK(I)ACCEPT和GETDATA后也要CLOSE一下。
ml_zhang 2000-07-14
  • 打赏
  • 举报
回复
我也曾作过从服务器传送文件的程序,设计思想与你的完全一致,但没有出现过你遇到的问题。我认为可能跟你的网络传输速度有关,你可以在每次循环过程中利用API函数SLEEP暂停几毫秒,如下:
For I=1 to N
Winsock(index).SendData MyData
Sleep(100)
Next
可能会解决你的问题。
祝 成功
suzhaohe99 2000-07-13
  • 打赏
  • 举报
回复
我知道一个机器的同一个port只能bind一次,我前面已经说了我只是用sock(0)去listen,而是在sock(0)接收到connect请求时,才load一个新的sock(i)去accept这次connect请求,而不是再让sock(i)去bind。
而且我在有间隔的情况下去发送请求是没有问题的,所以与bind跟本是无关的。至于sock(i)的localhost是多少,根本是没有影响的,因为他不bind,而只是accept
我要多谢liyang对我的问题的关注,再次表示感谢,希望我们大家能在讨论互相得到提高
liyang 2000-07-13
  • 打赏
  • 举报
回复
不好意思,好像错了。你的后面的sock的localport是0吧。
出错的意思是该连接建立的是nonblock方式(异步),可是遇到阻塞。
liyang 2000-07-13
  • 打赏
  • 举报
回复
那就对了。你的sock(0)的localport是多少?sock(1)的localport是多少。如果一样,那后面的sock控件都没有用。因为sock bind时,端口只能用一次。
suzhaohe99 2000-07-13
  • 打赏
  • 举报
回复
可能不是数据量的问题,因为:
我用一个循环去发送数据,前几次都不能成功,而是某一两次能成功
liyang 2000-07-13
  • 打赏
  • 举报
回复
你每次接数据时,数据的大小是多少?如果每次都是8192,那可能会造成缓冲区溢出(winsock缺省的是8192)
suzhaohe99 2000-07-13
  • 打赏
  • 举报
回复
我有两点要说明:
1.我用的是一个控件数组,用第一个sock(0)去listen,如果有请求到来的话,就:
load sock(i) '也就是新产生一个sock,它的任务就是接受请求
再用sock(i)去 accept 本次请求

2.经过调试,我发现在出现错误的时候跟本就不会进入dataarrival事件,因为这时client端的socket处于connecting状态,就更不用提发送数据了
liyang 2000-07-13
  • 打赏
  • 举报
回复
甚么叫"就用一个新的winsock去accept",你用的是udp还是tcp
如果用新的,那localport怎么办?

你在dataarrival事件中加doevents了吗?

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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