再问; <紧急求救,使用winsock的thread问题>

kaku_you 2003-01-20 06:10:29
------------------------以前的问题-----------------------------
http://expert.csdn.net/Expert/topic/1360/1360921.xml?temp=.5598719

我的程序要通过telnet连接31台使用telnet server的服务器,我使用如下方法进行处理

1.继承CWinThread在里面添加SOCKET类型的成员netsock

2.发送函数使用
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(netsock,&writefds);
int sv = ::select(FD_SETSIZE, NULL, &writefds, NULL, &timeout);
if( sv<=0 )return;
::send(netsock,(LPCSTR)cmd,cmd.GetLength(), 0);
的程序来发送

3.接收函数使用
fd_set readfds;
FD_ZERO( &readfds );
FD_SET ( netsock,&readfds );
int sv=::select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);
if( sv <= 0 )return;
int recv_size = ::recv(netsock,buf,buf_len, 0);
的程序来接收

连接4,5台服务器没有任何问题,一连接31台的服务器就会经常发生某几个recv函数返回-1,我用WSAGetLastError函数取得的err id号是183,我想问大家,我的winsocket方法是不是不对,在多线程下是不是有正确的使法?

后来用sniffer监视,发现出错的socket连接出现以下现象;
--------------------用sniffer监视的结果----------------------

1.收到数据包A,程序判断内容,是期待内容 (sniffer里显示某个服务器发数据包A到程序主机)
2.程序发送数据包B,程序用函数send,结果OK(!!! sniffer里没有数据包B的发送纪录)
3.recv函数返回-1(!!! sniffer里显示那个服务器重发数据包A 5次到程序主机)

我想问大家有谁了知道为什么会发生这种情况
...全文
34 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengchangshuo 2003-01-23
  • 打赏
  • 举报
回复
这样肯定有问题啊,你发送和接受时要用线程控制啊,要不然就出现与时间有关的错误了,可以用信号量,临界区,锁等等控制。
cxu123 2003-01-22
  • 打赏
  • 举报
回复
看不到你生成SOCKET的代码,你是不是把netsock设成Non-block(非阻塞)模式了,在SOCKET的非阻塞模式接受会返回-1,这很正常。但是如果你的SOCKET HANDLE在非阻塞模式这段代码就不对了,看你的情况很像。
HongHuer 2003-01-21
  • 打赏
  • 举报
回复
提议:

//开 select 线程, 专门 select write
UINT SelectWriteThread()
{
while(true)
{
if(bsome)//结束线程
{
return 1;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(netsock,&writefds);
int sv = ::select(FD_SETSIZE, NULL, &writefds, NULL,
&timeout);
if( sv<=0 )return;
//发消息,在消息响应里 send
//SendMessage
}

//开 select 线程, 专门 select read
UINT SelectReadThread()
{
while(true)
{
if(bsome)//结束线程
{
return 1;
}
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(netsock,&readfds);
int sv = ::select(FD_SETSIZE, &read, NULL, NULL,
&timeout);
if( sv<=0 )return;
//发消息,在消息响应里 recv
//SendMessage()
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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