socket listen后的accept问题

leycnley 2007-10-28 03:11:31
我自己定义了一个socket类
其中有两个成员函数:
BOOL CServer::Listen()
{
if(listen(st,5)!=0)
return FALSE;
return TRUE;
}
在调用Listen()后开一个线程调用下面的成员函数:
void CServer::Run()
{
SOCKET cst;
sockaddr_in saddr;
int lensaddr=sizeof(saddr);
char buffer[LENBUF];
cst=accept(this->st,(sockaddr*)&saddr,&lensaddr);

switch(atoi(buffer))
{
case CT_EXIT: //receives exit message;
SocketLst* lst=lst->getfirst();
while(lst!=0)
{
if(lst->getsocket()==cst)
{
lst->del();
return;
}
lst=lst->getnext();
}
break;
}

for(SocketLst* slst=slst->getfirst();slst!=0;slst=slst->getnext())
{
if(cst==slst->getsocket() || saddr.sin_addr.S_un.S_addr==slst->getsaddr().sin_addr.S_un.S_addr)
{
for(SocketLst* mlst=mlst->getfirst();mlst!=0;mlst=mlst->getnext())
{
send(mlst->getsocket(),buffer,LENBUF,0);
}
return;
}
}
static SocketLst newlst(cst,saddr);
for(SocketLst* lst=lst->getfirst();lst!=0;lst=lst->getnext())
{
send(lst->getsocket(),buffer,LENBUF,0);
}
}

运行很流畅,but it doesn't work!
怎么解决阿?
...全文
300 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
leycnley 2007-11-02
  • 打赏
  • 举报
回复
我发现问题了。好像是在程序退出的时候才执行发送。为什么?
线程确实开了。但是为什么在程序退出时才send???
UndefinedCoder 2007-10-31
  • 打赏
  • 举报
回复
既然已经知道accept调用失败,怎么不用WSAGetLastError分析一下错误原因?
zxdlms 2007-10-30
  • 打赏
  • 举报
回复
我觉得你的run的函数有些不妥,你把那个线程的那个执行函数贴出来看看。
leycnley 2007-10-30
  • 打赏
  • 举报
回复
线程执行函数:
void RunTime(CServer svr)
{
while(state==1)
{
svr.Run();

Sleep(1000);
}
}
leycnley 2007-10-29
  • 打赏
  • 举报
回复
线程是开启了。运行方面也没什么问题。还有什么可能?
zxdlms 2007-10-28
  • 打赏
  • 举报
回复
cst=accept(this- >st,(sockaddr*)&saddr,&lensaddr);

在开线程的时候传递一个this指针进去,然后用那个参数访问类的成员变量。


zxdlms 2007-10-28
  • 打赏
  • 举报
回复
你贴的代码accept这段没什么问题啊。

你看看accept的返回错误是什么,另外可能是你的多线程的问题。
leycnley 2007-10-28
  • 打赏
  • 举报
回复
已调试。ACCEPT失败了。
listen成功。
SocketLst是链表类。
zxdlms 2007-10-28
  • 打赏
  • 举报
回复
不一定是accept的问题,你可以调试一下看看accept是否成功,应该好好查一下Run的实现。

18,357

社区成员

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

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