accept()函数为什么不阻塞?

z15418676 2010-07-26 10:47:58
BOOL WSocket::CreateServer(int port, int backlog,LPCSTR IP)
{
if(m_bListened == TRUE) CloseServer();

struct sockaddr_in local;

LPHOSTENT lpHost;

//创建监听socket
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(m_sServer == SOCKET_ERROR)
{
err = WSAGetLastError();
return FALSE;
}
m_hostIp=IP;
lpHost = gethostbyname(IP);
if(lpHost == NULL) return FALSE;
//添参数
local.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr));
local.sin_family = AF_INET;
local.sin_port = htons(port);

if(bind(m_sServer, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
err = WSAGetLastError();
closesocket(m_sServer);
return FALSE;
}

//开始侦听
if(listen(m_sServer, backlog) != 0)
{
err = WSAGetLastError();
closesocket(m_sServer);
return FALSE;
}

m_nServerPort = port;
m_bListened = TRUE;
m_bNeedCloseServer = TRUE;

return TRUE;
}


BOOL WSocket::StartServer(DEALPROC lpDealFunc)
{
if(!m_bListened) return -1;
if(m_sServer == NULL) return -1;

DWORD dwThreadId;
SERVERPARA *para;

para = new SERVERPARA;
para->s = m_sServer;
para->port = m_nServerPort;
para->lpDealFunc = lpDealFunc;

m_hServerThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(&WSocket::ServerProc), (LPVOID)(para), 0, &dwThreadId);

if(m_hServerThread == NULL)
{
delete para;
err = WSAGetLastError();
return FALSE;
}
printf("%s","启动服务器\n");
return TRUE;
}
DWORD WSocket::ServerProc(LPVOID lpParm)
{
SERVERPARA *para = (SERVERPARA*)lpParm;

if(para == NULL) return -1;

SOCKET s = para->s;
int port = para->port;
DEALPROC lpDealFunc = para->lpDealFunc;
delete para;

SOCKET sClient;
struct sockaddr_in addr;
int iAddrSize= sizeof(addr);
char IP[32];
HANDLE hThread;
DWORD dwThreadId;
DEALPARA *parac;

while(1)
{
printf("进入监听状态\n");
sClient = accept(s, (struct sockaddr *)&addr, &iAddrSize);
printf("%d\n",sClient);
if(sClient == SOCKET_ERROR) {
int error=WSAGetLastError();
break;
}
sprintf(IP, "%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1,
addr.sin_addr.S_un.S_un_b.s_b2,
addr.sin_addr.S_un.S_un_b.s_b3,
addr.sin_addr.S_un.S_un_b.s_b4);

parac = new DEALPARA;
memset(parac->IP, 0, sizeof(parac->IP));
parac->s = sClient;
parac->port = port;
parac->lpDealFunc = lpDealFunc;
memcpy(parac->IP, IP, strlen(IP));

//侦听到连接,开一个线程
hThread = CreateThread(NULL, 0, DealProc, (LPVOID)(parac), 0, &dwThreadId);
InsertIntoSendline(sClient,addr);
printf("将%s添加到连接队列",IP);
if(hThread == NULL) delete parac;
printf("启动一个服务器线程:%d\n",hThread);
}
return 0;
}


服务器启动以后我建立了一个线程开始监听,但调试发现accept根本没有阻塞!请高手指点
...全文
690 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2010-07-26
  • 打赏
  • 举报
回复
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
===>
m_sServer = socket(AF_INET, SOCK_STREAM, 0);
cattycat 2010-07-26
  • 打赏
  • 举报
回复
根据你的error no看是在哪一步错误的,然后再修改。
z15418676 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cattycat 的回复:]
你的WSocket::ServerProc成员函数是静态函数吗?如果不是,线程是不会创建成功的。
[/Quote]
ServerProc是静态函数
cattycat 2010-07-26
  • 打赏
  • 举报
回复
你的WSocket::ServerProc成员函数是静态函数吗?如果不是,线程是不会创建成功的。
z15418676 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 binghuazh 的回复:]
看看getlasterror 是不是出错返回了?
如果不是,就利用fcntl设置一下阻塞模式
g'l
[/Quote]
int error=WSAGetLastError();
error=10038;
但是socket建立没有问题啊!
blingpro 2010-07-26
  • 打赏
  • 举报
回复
看看getlasterror 是不是出错返回了?
如果不是,就利用fcntl设置一下阻塞模式
g'l
cattycat 2010-07-26
  • 打赏
  • 举报
回复
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
这个最后一个参数是0,也可以是IPPROTO_TCP,但不是IPPROTO_IP.
cnlm2 2010-07-26
  • 打赏
  • 举报
回复
楼上正解!

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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