大家帮个忙,第一次用winsocket,不明白这些代码那里出错了。。。。谢谢

时间:2020-11-27 01:44:20
环境:VC7.0
带MFC的控制台应用程序。
有两个地方不明白的,希望大家指点的~~
1.accept不是阻塞线程吗?我在这里用了,可是到儿程序还是一样的执行下去,并结束应用程序。
2.listen是立即返回的,那怎么去监听端口,我想应是在listen那里循环的,等有了连结才返回的。不太明白这些的。
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
    char a;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
}
smtpSocket listenSocket;
smtpSocket cSocket;
    listenSocket.Create(25);
listenSocket.Listen();
if(!listenSocket.Accept(cSocket))//为什么不像例程那样循环
{
cout<<"wait client";
cin>>a;
return 0;
}
cout<<"success"<<endl;
cin>>a;

return 0;
}
我从MSDN下的例程时,在accept句加入断点时,程序就一直在那儿循环,我的为什么不是呀~~

5 个解决方案

#1


没人呀
自己ding了

#2


没完全看懂你的意思,什么叫一直在那里循环,不用while怎么叫循环。
阻塞方式应该是accept阻塞线程,listen调用过就监听了,除非关闭socket。还是不要用阻塞方式了,除非特殊情况

#3


你怎么用if来做循环阿,好像if没有循环的功能吧?我看到的大多数的socket程序用的是while(1)这种死循环

#4


The accept function can block the caller until a connection is present if no pending connections are present on the queue, and the socket is marked as blocking. If the socket is marked as nonblocking and no pending connections are present on the queue, accept returns an error.
大意就是
对于阻塞socket,accept在请求队列为空即没有未决的连接请求时阻塞调用线程
对于非阻塞socket,accept在请求队列为空即没有未决的连接请求时返回错误

#5


listen是立即返回吧.
if(!listenSocket.Accept(cSocket))//是不是在此处阻塞
{
cout<<"wait client";
cin>>a;
return 0;
}
//
///
////
下面这程式片断是一个可以正常运行的程式中摘取的
if(bind(sock,(struct sockaddr *)&sockaddr,sizeof(struct sockaddr_in)) < 0 || listen(sock,5) < 0)

{

closesocket(sock);

return -1;

}

csockaddrlen = sizeof(struct sockaddr_in);

newsock = accept(sock,(struct sockaddr *)&csockaddr,&csockaddrlen);
没有循环的,但是程式会一直临听下去的。不明白

#1


没人呀
自己ding了

#2


没完全看懂你的意思,什么叫一直在那里循环,不用while怎么叫循环。
阻塞方式应该是accept阻塞线程,listen调用过就监听了,除非关闭socket。还是不要用阻塞方式了,除非特殊情况

#3


你怎么用if来做循环阿,好像if没有循环的功能吧?我看到的大多数的socket程序用的是while(1)这种死循环

#4


The accept function can block the caller until a connection is present if no pending connections are present on the queue, and the socket is marked as blocking. If the socket is marked as nonblocking and no pending connections are present on the queue, accept returns an error.
大意就是
对于阻塞socket,accept在请求队列为空即没有未决的连接请求时阻塞调用线程
对于非阻塞socket,accept在请求队列为空即没有未决的连接请求时返回错误

#5


listen是立即返回吧.
if(!listenSocket.Accept(cSocket))//是不是在此处阻塞
{
cout<<"wait client";
cin>>a;
return 0;
}
//
///
////
下面这程式片断是一个可以正常运行的程式中摘取的
if(bind(sock,(struct sockaddr *)&sockaddr,sizeof(struct sockaddr_in)) < 0 || listen(sock,5) < 0)

{

closesocket(sock);

return -1;

}

csockaddrlen = sizeof(struct sockaddr_in);

newsock = accept(sock,(struct sockaddr *)&csockaddr,&csockaddrlen);
没有循环的,但是程式会一直临听下去的。不明白