阻塞SOCKET SERVER的问题

FOXHENGXING 2009-07-06 06:00:45



最近用vc++6.0写了个简单的阻塞的循环TCP SERVER,我要说的情况是这样,
有两个客户端A和B请求与SERVER通信,请求的时候有先后次序的,
首先A发起连接且成功了,接下来SERVER正在RCVE A 发过来的数据,为了模拟,我让A和B都发十次数据,发送完毕后退出客户端,每次发送都间隔2秒,

当客户端A发送两三次的时候,我启动B再发起连接,可这时B客户端connect()也返回了成功,同样也十次send数据,可居然也成功了,但此时SERVER正在忙于收A客户端的数据中呢,我的疑惑是服务器此时没执行ACCPET,为什么也会返回成功。

希望能得到大家的帮助,谢谢
我贴一下tcpserver关键性的代码


	tcpserver.cpp	
while (TRUE)
{


ClientSocket = accept(ListeningSocket, (SOCKADDR *)
&ClientAddr,&ClientAddrLen);

if (ClientSocket==INVALID_SOCKET )
{
PrintError("Call accpet");
}
//显示连接的端口号和IP地址
printf( "%d.Connection from %s on port %d\n" ,ntime,inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));



printf("Wait to Recveive data from client socket\n");

char cBuffer[100]="";
int nret;
while (TRUE)
{
nret=recv(ClientSocket,cBuffer,99,0);

if (nret==SOCKET_ERROR)
{
PrintError("call recv");
break;
}
else
{

if (nret==ZERO)
{
PrintError("call recv");
break;

}
else
{
//显示收到的数据
printf("%s ",cBuffer);
}
}

}

}



...全文
18 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FOXHENGXING 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dong364 的回复:]
可以调试啊, 看看在哪里break了,对两处返回值都PrintError("call recv");是不好的
[/Quote]
的确这样是不好啦,我只是写一下测试,谢谢朋友的提醒,改正!
FOXHENGXING 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
A,B都和服务器建立了连接,发送的数据过去,都在服务器接收缓冲区中,当然都可以接收到,只不过服务器先处理A的,B的后面处理
[/Quote]

我写的这个是循环阻塞的,

当A客户端在连接server的时候,此时服务器ACCEPT这个连接,开始进入RECV循环,RECV在没有收到数据的时候一直阻塞着的,除非客户端关闭了或者服务端能收到数据才会返回,返回后么会再次RECV。

那么A客户端在没关闭之前,B客户端怎么能连接得到呢

FOXHENGXING 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijianli9 的回复:]
你可以调试CLIENT A,在循环发送数据的时候设置断点,这个时候你发了两次数据,然后断点断在那里不动,然后启动CLIENT B
这个时候SERVER肯定是阻塞在那里的,CLIENT B肯定是连接不成功的吧。
[/Quote]

我按照你说的方法看了一下,当服务器阻塞在RECV的时候,另一个客户端发起连接居然能成功。可奇怪的是,我再发起第三个客户端的时候,就终于出现了10061错误了
lijianli9 2009-07-06
  • 打赏
  • 举报
回复
你可以调试CLIENT A,在循环发送数据的时候设置断点,这个时候你发了两次数据,然后断点断在那里不动,然后启动CLIENT B
这个时候SERVER肯定是阻塞在那里的,CLIENT B肯定是连接不成功的吧。
dong364 2009-07-06
  • 打赏
  • 举报
回复
可以调试啊, 看看在哪里break了,对两处返回值都PrintError("call recv");是不好的
oyljerry 2009-07-06
  • 打赏
  • 举报
回复
A,B都和服务器建立了连接,发送的数据过去,都在服务器接收缓冲区中,当然都可以接收到,只不过服务器先处理A的,B的后面处理

18,356

社区成员

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

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