阻塞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);
}
}

}

}



...全文
48 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的后面处理
内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。

18,357

社区成员

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

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