我在对话框里initdialog里
socket() bind() listen(listensocket,5)
之后,现在想对处理连接和收发信息,知道要accept()
但放在哪里,放在listen()后好象不行,于是想开线程处理多连接,又不知道如何开法?请指导我,并告诉我如何修改连接数,令连接数不低于五
socket() bind() listen(listensocket,5)
之后,现在想对处理连接和收发信息,知道要accept()
但放在哪里,放在listen()后好象不行,于是想开线程处理多连接,又不知道如何开法?请指导我,并告诉我如何修改连接数,令连接数不低于五
example:
//
//TCP·þÎñÆ÷¶Ë¼àÌýÏß³Ì
//
UINT TCPServerListenThread(LPVOID pParam)
{
while (1)
{
CWinThread* hHandle; // Ï߳̾ä±ú
SOCKET clientSocket; //¿Í»§socket //µÈ´ýÁ¬½Ó£¬×èÈû
clientSocket = accept(((MySocket*)pParam)->hSocket,0,0);
InterlockedIncrement(&g_nConnecttedSocket);//Á¬½ÓÊýÔö¼Ó //ÓÐÁ¬½Óʱ£¬´´½¨ÈÎÎñ
hHandle=AfxBeginThread(TCPServerThread,(LPVOID)clientSocket);
}
return 1;
}
//
//TCP·þÎñÆ÷¶Ë·þÎñÏß³Ì
//
UINT TCPServerThread(LPVOID pParam)
{
SOCKET ClientSocket = (SOCKET)pParam;
char buffer[MAX_BUFFER_SIZE];
char pBuf[30];
WORD iLength = 0;
WORD iTimes = 0;
while (1)
{
ZeroMemory(pBuf,sizeof(pBuf));
//¸ø¿Í»§¶Ë·¢ËÍÁ¬½ÓÈ·ÈÏÐÅÏ¢
// CopyMemory(pBuf,"connectted",10);
// send(ClientSocket,pBuf,10,0); int len = recv(ClientSocket,pBuf,sizeof(pBuf),0);
if (len > 0) //ÊÕµ½Êý¾Ý
{
do something
if (SOCKET_ERROR == sendLen)
{
closesocket(ClientSocket);
return 0;
}
InterlockedExchangeAdd(&g_nCurrentBPS,sendLen);
}
closesocket(ClientSocket);
//InterlockedDecrement(&g_nConnecttedSocket);//Á¬½ÓÊý¼õÉÙ
return 1;
}
else if(0 == len)//Á¬½Ó¹Ø±Õ
{
closesocket(ClientSocket);
return 0;
}
} return 1;
}
accept部分看不出什么问题
应该可以正常工作的
CWinThread* hHandle;
hHandle=AfxBeginThread(TCPServerListenThread,(LPVOID)this);TCPServerListenThread函数体:
UINT TCPServerListenThread(LPVOID pParam)
{
while (1)
{
CWinThread* hHandle;
SOCKET clientSocket;
clientSocket = accept(((MySocket*)pParam)->hSocket,0,0); hHandle=AfxBeginThread(TCPServerThread,(LPVOID)clientSocket);
}
return 1;
}UINT TCPServerThread(LPVOID pParam)
{
SOCKET ClientSocket = (SOCKET)pParam; while (1)
{
收/发数据
} return 1;
}
Create(PORT);
Listen();
while(Accept(new socket object))
{
new socket object.Receive(buffer)
}
Client:
Create();
connect(ip,port);
send...
就是这种模式
//侦听
ret = listen(m_hSocket, 2);
if(ret == SOCKET_ERROR){
cout<<"Listen Error: %d \n"; return ;
}
//
SOCKET s = accept(m_hSocket, NULL, NULL);
if(s == SOCKET_ERROR){
cout<<"Accept Error: %d \n";
return ;
}
cout<<"客户连接成功!\n";
//
char buff[256];
ret = recv(s, buff, 256, 0);
if(ret == 0 || ret == SOCKET_ERROR ){
cout<<"Recv data error: %d\n";//, WSAGetLastError());
return ;
}
/**
4 处理客户消息
**/
}
又因为默认情况下,accept()、send()、recv()都会阻塞,所以接受一个连接后,还需要再启动一个线程来实现数据的传送。大概需要这样,
在主线程:
socket();
bind();
listen();
启动接受连接的线程; // 把socket作为参数传递,或通过全局变量传递在接受连接的线程:
循环 {
SOCKET s_conn = accept(); // 需要确认没有错误
启动数据传送线程; // 把s_conn作为参数传递,此处不能用全局变量,因为可能接受多个连接
} // 循环// 另有一种做法是在这个线程进行数据的传送,开启新的线程继续accept()在数据传送线程:
.....
send();
.....
recv();
......
return exit_code;