Socket为什么会不停地Accept?

「已注销」 2004-04-26 10:28:27
大家帮忙看看这段代码:
放在主线程中没什么问题,但是如果放在子线程中就会不停地Accept错误(就是在最后几行那里不停地continue)

WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
Application->MessageBoxA("Socket 初始化失败!","错误",MB_ICONERROR+MB_OK);
ExitProcess(0);
}

sockaddr_in addr;
int port=2121;
int SockErr;
sckServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
//addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sckServer,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
{
Application->MessageBoxA("Socket 初始化失败!","错误",MB_ICONERROR+MB_OK);
ExitProcess(0);
}
if(listen(sckServer,50)==SOCKET_ERROR)
{
Application->MessageBoxA("Socket 初始化失败!","错误",MB_ICONERROR+MB_OK);
ExitProcess(0);
}

while(true)
{
SOCKET sckConn;
sockaddr saConn;
int iAddrLen;
bool bAccept=false;
if((sckConn=accept(sckServer,&saConn,&iAddrLen))==INVALID_SOCKET)
{
continue;
}
..........
}
...全文
208 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sailormansoft 2010-06-24
  • 打赏
  • 举报
回复
学习了~~~~~
「已注销」 2004-05-08
  • 打赏
  • 举报
回复
行了,就是int iAddrLen = sizeof(sockaddr)

谢谢各位了!

但是为什么放在主线程中不会出现这种情况呢?
ToIP 2004-04-30
  • 打赏
  • 举报
回复
int iAddrLen = sizeof(sockaddr)

正解
rd73 2004-04-30
  • 打赏
  • 举报
回复
你把int iAddrLen = sizeof(sockaddr)试试,我也是这样写的,但是很正常啊.
线程的操作方法一样,accept有点不同,我的如下:

bool TSocket::Accept(TSocket * pSocket)
{
int newsock;
sockaddr_in addr;
int size;

if(sock < 0)
return false;

if(pSocket == 0)
return false;

size = sizeof(addr);
memset(&addr, 0, size);
newsock = accept(sock, (sockaddr *)&addr, &size);
if(newsock > 0)
{
pSocket->Attach(newsock);
return true;
}
else
return false;
}
ToIP 2004-04-27
  • 打赏
  • 举报
回复
对了,你处理完之后应该,调用shutdown();函数来关闭连接,或者disconnect();
否则会出问题的
ToIP 2004-04-27
  • 打赏
  • 举报
回复
1)WSAGetLastError(),看错误原因
2)单步调试,找出准确原因,如果还是不行,再法帖问
l_clove 2004-04-27
  • 打赏
  • 举报
回复
sckConn=accept(sckServer,&saConn,&iAddrLen))==INVALID_SOCKET ?
用ShowMessage(SysErrorMessage(WSAGetLastError());看一下是什么错误
if((sckConn=accept(sckServer,&saConn,&iAddrLen))==INVALID_SOCKET)
{
ShowMessage(SysErrorMessage(WSAGetLastError());
}
newcoco800927 2004-04-27
  • 打赏
  • 举报
回复
同意楼上的
「已注销」 2004-04-26
  • 打赏
  • 举报
回复
高手呢?
「已注销」 2004-04-26
  • 打赏
  • 举报
回复
怎么没人回答呀
都不知道吗?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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