关于网络编程多线程死循环问题,我写一个聊天服务器程序,基于TCP的,
WSADATA wsaData;
if( WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//初始化WSA 调用成功则返回0
{
MessageBox(NULL,"初始化失败","",MB_OK);
WSACleanup();
} SOCKET ServerSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //SOCK_STREAM 流式套接字
//IPPROTO_TCP TCP协议 用于流式套接字
if(INVALID_SOCKET ==ServerSock)
{
MessageBox(NULL,TEXT("创建套接字失败"),"",MB_OK);
WSACleanup();
}
sockaddr_in server;
server.sin_addr.S_un.S_addr = INADDR_ANY; //本机ip
server.sin_family = AF_INET ; //指定通信协议
BOOL Err;
UINT Port =GetDlgItemInt(hwnd,IDC_PORT,&Err,TRUE);
server.sin_port = htons(Port); //主机字节顺序转成网络字节顺序
if(bind(ServerSock,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
{
MessageBox(NULL,TEXT("绑定套接字失败"),"",MB_OK);
closesocket(ServerSock);
} if(listen(ServerSock,5)==SOCKET_ERROR)
{
MessageBox(NULL,TEXT("监听失败"),"",MB_OK);
closesocket(ServerSock);
}
SetDlgItemText(hwnd,IDC_SYSTEMMSG,TEXT("服务器正在监听....."));
SOCKET TcpSocket;
SOCKADDR_IN TcpClientAddr;
while(1)
{
int alen;
TcpSocket=accept(ServerSock,(SOCKADDR*)&TcpClientAddr,&alen);
if(TcpSocket<0)
{
exit(1);
}
........
}
在上面的循环中为什么会出现死循环呢 我在这个循环中用accept不断接收连接请求,到底哪错了啊
WSADATA wsaData;
if( WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//初始化WSA 调用成功则返回0
{
MessageBox(NULL,"初始化失败","",MB_OK);
WSACleanup();
} SOCKET ServerSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //SOCK_STREAM 流式套接字
//IPPROTO_TCP TCP协议 用于流式套接字
if(INVALID_SOCKET ==ServerSock)
{
MessageBox(NULL,TEXT("创建套接字失败"),"",MB_OK);
WSACleanup();
}
sockaddr_in server;
server.sin_addr.S_un.S_addr = INADDR_ANY; //本机ip
server.sin_family = AF_INET ; //指定通信协议
BOOL Err;
UINT Port =GetDlgItemInt(hwnd,IDC_PORT,&Err,TRUE);
server.sin_port = htons(Port); //主机字节顺序转成网络字节顺序
if(bind(ServerSock,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
{
MessageBox(NULL,TEXT("绑定套接字失败"),"",MB_OK);
closesocket(ServerSock);
} if(listen(ServerSock,5)==SOCKET_ERROR)
{
MessageBox(NULL,TEXT("监听失败"),"",MB_OK);
closesocket(ServerSock);
}
SetDlgItemText(hwnd,IDC_SYSTEMMSG,TEXT("服务器正在监听....."));
SOCKET TcpSocket;
SOCKADDR_IN TcpClientAddr;
while(1)
{
int alen;
TcpSocket=accept(ServerSock,(SOCKADDR*)&TcpClientAddr,&alen);
if(TcpSocket<0)
{
exit(1);
}
........
}
在上面的循环中为什么会出现死循环呢 我在这个循环中用accept不断接收连接请求,到底哪错了啊
解决方案 »
- VC++ Automation隐藏Excel菜单条问题
- 超级难题 在WORD中插入ACTIVEX作的输入框,为什么得不到焦点?请高手帮忙
- 怎样把正在运行的IE的一个插件(dll文件)卸出IE的进程空间,即可以删除这个dll文件
- 请问:如何在引入了一个lib后,在引入第二个lib库?文件名的位置已经被第一个占了,第二个怎么办呢?
- 如何取得条形码扫描器的数据?
- 谁来介绍一下vc中nmake的用法
- VC.NET PlatformSDK header file的问题
- Geforce 3Ti200在 linux 下的驱动程序怎样安装?
- WINDOWS下如何实现调色板的数据交换?(谢谢!!)
- 请问各位高手:操作系统调用CALLBACK函数的详细过程???
- 从客户端传送一个文件到服务端的指定文件夹中(该文件夹由客户端指定),要用到什么方面的知识?
- 怎么动态画图
这个改成
if (SOCKET_ERROR == TcpSocket)
{
exit(1);
}
试试。
这个改成
if (SOCKET_ERROR == TcpSocket)
{
break;
}
试试。
while(true)
{
break;
}
但不能加任何东西,一加就死.
while(1)
{
SOCKET TcpSocket = INVALID_SOCKET;
SOCKADDR_IN TcpClientAddr;
int alen;
TcpSocket=accept(ServerSock,(SOCKADDR*)&TcpClientAddr,&alen);
if(TcpSocket == INVALID_SOCKET )
{
exit(1);
}
........
}
accept
The Windows Sockets accept function accepts an incoming connection attempt on a socket.SOCKET accept (
SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen
);
Parameters
s
[in] A descriptor identifying a socket that has been placed in a listening state with the listen function. The connection will actually be made with the socket that is returned by accept.
addr
[out] An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the address family established when the socket was created.
addrlen
[out] An optional pointer to an integer that contains the length of the address addr.
SOCKET TcpSocket;
SOCKADDR_IN TcpClientAddr;
while(1)
{
int alen = sizeof(SOCKADDR_IN); // MUST INITIALIZE VALUE HERE!!!
TcpSocket=accept(ServerSock,(SOCKADDR*)&TcpClientAddr,&alen);
if(TcpSocket<0)
{
exit(1);
}
........
}
可能是循环一直在做, CPU没有时间去做其他事情了, 所以你的画面是死掉的现象。
{
switch(id)
{
case IDC_OK://启动服务
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
} if(LOBYTE(wsaData.wVersion)!=2||
HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return;
} //创建用于监听的套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
//等待客户请求到来
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcomee %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr)); //发送数据
send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100];
//接受数据
recv(sockConn,recvBuf,100,0); MessageBox(NULL,recvBuf,TEXT(""),MB_OK);
closesocket(sockConn);
} }
break;
default:
break;
}
}
这是代码,IDC_OK为启动服务,我一点击就会执行上面的代码,然后界面就死了。有什么问题吗
button按下后开一个线程A负责监视客户端的连接。button事件结束。线程A在不断运行中。
线程A一旦监视到一个连接。再针对这个连接开线程B,一个线程B只负责一个客户端的通信。
可能开多个线程B所以, 要用一个LIST记住线程B的HANDLE(方便在最后关闭时,停止线程)。 A
| | | |......
B B B B......最后别忘记在程序终止时,停止所有以上开的线程。