端口创建速度越来越慢,什么问题

pinetree 2003-10-14 10:51:18
我用循环:创建端口,与地址簿中的地址连接,检查其端口是否打开,然后再关闭端口
结果一开始创建端口速度很快,到3,4个以后就变慢,到了20个以后就不可忍受了.
缘程序如下:
CClientSocket pingSocket;
CString m_online;
int flag,nError;
for (int i=0;i<AddressBook_Len;i++)
{
pingSocket.Create(SENDPORT);
flag = pingSocket.Connect((LPCTSTR) AddressBook[i][1],LISTENPORT);
if (flag!=0)
{
m_ADDRESS_LIST.DeleteString(i);
m_online.Format("%s",AddressBook[i][0]);
m_online=m_online+"SOCKET OPEN";
m_ADDRESS_LIST.InsertString(i,m_online);

}
else
{
nError = pingSocket.GetLastError();
}
pingSocket.ShutDown(2);
pingSocket.Close();
}
请大侠告诉我如何解决,谢谢
还有,可不可以,创建一个端口,不关闭端口,只关闭连接
...全文
99 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pinetree 2003-10-16
  • 打赏
  • 举报
回复
七猫,谢谢了,这分给你吧,今后有什么问题再一起研究
sevencat 2003-10-15
  • 打赏
  • 举报
回复
象我那样写就行了。
64个套接字同时连接,最后检查SELECT状态。
很快的。
你可以试试。

connect中那个sleep是必要的,不然有些会失败的。
不要用多线程,没必要,记住:select+非堵塞就可以了,

上面那段函数结束后select一个缺省的等待时间,然后就可以了。是不是很简单,要我那段代码完整的吗?
pinetree 2003-10-15
  • 打赏
  • 举报
回复
除了用connect还有别的方法可以检查对方机处于侦听状态么?
quanch 2003-10-15
  • 打赏
  • 举报
回复
对方处于侦听状态当然就快啦!Connect需要等超时来判断是否真的没有连接上,建议使用多线程连接(这样避免主界面等待)或等到真正需要连接时连接(一次只连接一个)。
pinetree 2003-10-15
  • 打赏
  • 举报
回复
sorry,今天去仔细查了一下,发现时间是耗在
flag = pingSocket.Connect((LPCTSTR) AddressBook[i][1],LISTENPORT);
我的原意是想让本机去检查地址簿里的机器其LISTENPORT是否处于侦听状态,
现在的情况是对方机器处于侦听状态,则速度很快,如果不处于侦听状态,则速度会很慢。
有什么好的办法可以解决么?
sevencat 2003-10-15
  • 打赏
  • 举报
回复
#include "stdafx.h"

class KSocket
{
public:
char *data;
int len;
int status;
SOCKET m_socket;
public:
KSocket()
{
data=new char[64];
status=0;
}
~KSocket()
{
delete data;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
KSocket sarray[64];
int datasend=0;
int datarecv=0;
WSADATA m_data;
WSAStartup(MAKEWORD(2,2),&m_data);

for(int i=0;i<64;i++)
{
::Sleep(10);
sarray[i].m_socket=socket(AF_INET,SOCK_STREAM,0);
unsigned long param=1;
ioctlsocket(sarray[i].m_socket,FIONBIO,¶m);
SOCKADDR_IN saa;
memset(&saa,0,sizeof(saa));
saa.sin_family=AF_INET;
saa.sin_port=htons(5001);//在这里将端口换成你想SELECT的端口
saa.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
if(connect(sarray[i].m_socket,(sockaddr*)&saa,sizeof(saa))!=0)
std::cout<<"connect error"<<std::endl;
}

fd_set readfs;
fd_set writefs;
::Sleep(20);
while(true)
{

FD_ZERO(&readfs);
FD_ZERO(&writefs);

for(int i=0;i<64;i++)
{
if(sarray[i].status==0)
FD_SET(sarray[i].m_socket,&readfs);
if(sarray[i].status==1)
FD_SET(sarray[i].m_socket,&writefs);
}
::Sleep(5);

if(select(0,&readfs,&writefs,NULL,NULL)>0)
{
for(int i=0;i<64;i++)
{
if(sarray[i].status!=2)
{
if(FD_ISSET(sarray[i].m_socket,&readfs))
{
if((sarray[i].len=recv(sarray[i].m_socket,sarray[i].data,64,0))>0)
{
datarecv++;
sarray[i].status=1;
}
else
{
if(sarray[i].len==0)
{
sarray[i].status=2;
std::cout<<"socket closed"<<std::endl;
}
std::cout<<"error read"<<std::endl;
}

}
if(FD_ISSET(sarray[i].m_socket,&writefs))
{
int temp=sarray[i].len;
if((sarray[i].len=send(sarray[i].m_socket,sarray[i].data,temp,0))>0)
{
datasend++;
sarray[i].status=0;
}
else
{
if(sarray[i].len==0)
{
sarray[i].status=2;
std::cout<<"socket closed"<<std::endl;
}
std::cout<<"error read"<<std::endl;
}
}
}
}
std::cout<<"data recv: "<<datarecv<<" data send: "<<datasend<<std::endl;
}
}
WSACleanup();
return 0;
}
chijiao 2003-10-14
  • 打赏
  • 举报
回复
先看看时间耗在哪段代码啊。/
mfc168 2003-10-14
  • 打赏
  • 举报
回复
你的CClientSocket这个类里面的Create函数的问题
不知道你的内容是怎么写的
但是按照你所说的分析,应该属于内部来进行分配,可能存在扫描每个端口,如果发现已经占用,返回错误,这样肯定会慢的,检查一下你的Create函数

可以
sevencat 2003-10-14
  • 打赏
  • 举报
回复
设为非堵塞,这段代码是我测试服务器用的,模拟64个用户同时向服务器发送数据。
我用的不是CSocket,用的是原始的socket函数。

不知道你的代码是不是真的要用CSocket,
pinetree 2003-10-14
  • 打赏
  • 举报
回复
CClientSocket类是继承的CSocket类,其中的Create函数没有重载过。

pingSocket.Create(SENDPORT);
时间就耗在这段代码上。

七猫,你程序中 ioctlsocket(sarray[i].m_socket,FIONBIO,¶m);
这段是什么意思?
sevencat 2003-10-14
  • 打赏
  • 举报
回复
我同时创建64个端口,都很快成功的。
for(int i=0;i<64;i++)
{
::Sleep(10);//仅仅是因为要CONNECT才要SLEEP的,不然不要这句话。
sarray[i].m_socket=socket(AF_INET,SOCK_STREAM,0);
unsigned long param=1;
ioctlsocket(sarray[i].m_socket,FIONBIO,¶m);
SOCKADDR_IN saa;
memset(&saa,0,sizeof(saa));
saa.sin_family=AF_INET;
saa.sin_port=htons(5001);
saa.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
if(connect(sarray[i].m_socket,(sockaddr*)&saa,sizeof(saa))!=0)
std::cout<<"connect error"<<std::endl;
}
fanfyj 2003-10-14
  • 打赏
  • 举报
回复
up

18,356

社区成员

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

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