有些奇怪了

whiteclouds 2006-12-28 12:00:43
正在写一个C/S程序,客户端执行一次connect,服务器端就不停执行accept,开了一大堆线程!真晕了,不知问题在哪里?
服务器端初始化:
sock_addr.sin_family=AF_INET;
skListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
nResult=WSAGetLastError();
if(nResult!=0)
return nResult;
sock_addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sock_addr.sin_port=htons(LocalPort);
memset(sock_addr.sin_zero,0,sizeof(sock_addr.sin_zero));
nResult=bind(skListen,(sockaddr *)&sock_addr,sizeof(sock_addr));
if(nResult!=0)
{
return WSAGetLastError();
}
nResult=listen(skListen,SOMAXCONN);
if(nResult!=0)
return WSAGetLastError();
监听线程;
fd_set m_fs;
FD_ZERO(&m_fs);
FD_SET(sLs,&m_fs);
......
slR=select(0,&m_fs,NULL,NULL,&tm);
if(slR>0 && slR!=SOCKET_ERROR)
{
DWORD dwThreadID=0;
parent->skWork=accept(sLs,(struct sockaddr*)&addr_in,&len);
if((hThread=CreateThread(NULL,0,AcpThread,parent,CREATE_SUSPENDED,&dwThreadID))==NULL)
return GetLastError();
ResumeThread(hThread);
// FD_ZERO(&m_fs);
break;
}
}
FD_SET(sLs,&m_fs);
Sleep(100);
......
很着急啊!大家帮忙!谢谢
...全文
193 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrameMan 2006-12-29
  • 打赏
  • 举报
回复
那恭喜你了 呵呵
whiteclouds 2006-12-29
  • 打赏
  • 举报
回复
自己已经搞定了,是accept之前忘了给len赋值了。不好意思,谢谢你。
ProgrameMan 2006-12-28
  • 打赏
  • 举报
回复
我的程序在工程里呢,不方便给,这样你把你的程序发给我,我帮你调调看

cygroup#tom.com # to @
whiteclouds 2006-12-28
  • 打赏
  • 举报
回复
ProgrameMan(我要学汇编) ( ):
这样还是不停地开线程!你有没有这方面的例子发给我?
mail:johnken@126.com
谢谢
ProgrameMan 2006-12-28
  • 打赏
  • 举报
回复
在试试

if(FD_ISSET(sLs, &m_fs))
{
DWORD dwThreadID=0;
parent->skWork=accept(sLs,(struct sockaddr*)&addr_in,&len);
if((hThread=CreateThread(NULL,0,AcpThread,parent,CREATE_SUSPENDED,&dwThreadID))==NULL)
return GetLastError();
ResumeThread(hThread);
}
whiteclouds 2006-12-28
  • 打赏
  • 举报
回复
在accept处设断点看addr_in值,每次其中的客户地址都是0xCC,怀疑初始化部分没写对,可看了好几遍都没找到错误,晕!
whiteclouds 2006-12-28
  • 打赏
  • 举报
回复
这样写貌似没有区别,我这样做了,结果还是一样。
ProgrameMan 2006-12-28
  • 打赏
  • 举报
回复
改成这样:

fd_set m_fs;
while(Way)
{
FD_ZERO(&m_fs);
FD_SET(sLs,&m_fs);
Way=parent->nWay;
slR=select(0,&m_fs,NULL,NULL,&tm);
if(slR>0 && slR!=SOCKET_ERROR)
{
DWORD dwThreadID=0;
parent->skWork=accept(sLs,(struct sockaddr*)&addr_in,&len);
if((hThread=CreateThread(NULL,0,AcpThread,parent,CREATE_SUSPENDED,&dwThreadID))==NULL)
return GetLastError();
ResumeThread(hThread);
}
}
whiteclouds 2006-12-28
  • 打赏
  • 举报
回复
不行啊!
改完的代码;
fd_set m_fs;
FD_ZERO(&m_fs);
FD_SET(sLs,&m_fs);
while(Way)
{
Way=parent->nWay;
slR=select(0,&m_fs,NULL,NULL,&tm);
if(slR>0 && slR!=SOCKET_ERROR)
{
DWORD dwThreadID=0;
parent->skWork=accept(sLs,(struct sockaddr*)&addr_in,&len);
if((hThread=CreateThread(NULL,0,AcpThread,parent,CREATE_SUSPENDED,&dwThreadID))==NULL)
return GetLastError();
ResumeThread(hThread);
// FD_ZERO(&m_fs);
}
FD_ZERO(&m_fs);
FD_SET(sLs,&m_fs);
Sleep(100);
}
ProgrameMan 2006-12-28
  • 打赏
  • 举报
回复
还有你把最关键的代码部分省略了,监听线程部分的
ProgrameMan 2006-12-28
  • 打赏
  • 举报
回复
把这两句放到循环里

FD_ZERO(&m_fs);
FD_SET(sLs,&m_fs);

18,356

社区成员

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

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