创建多线程服务器的问题
problem of creating multithreaded server
我正在尝试创建一个多客户端服务器,我设法确保服务器和单个客户端之间的信息交换,但是现在我必须使用线程,以便多个客户端可以同时与服务器连接。
我按照网上的说明做了,但是我得到了一个错误
'
CreateThread
':不能将参数3从'unsigned long (void *)
'转换为'unsigned long (__stdcall *) (void *)
'
你会看到,在这个函数中,我返回0,因为我不知道该返回什么。
下面是我的代码:#include"serveur.h"
server::server(int p)
{
port = p;
}
int server::init()
{
WORD wVersionRequested;
WSADATA Data;
int error= (WSAStartup(MAKEWORD(2,2), &Data ));
if(error != 0 )
{
cerr <<"WSAStartup a échoué "<< endl;
return 1;
}
else
{
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( port );
ServerAddr.sin_addr.s_addr=htons(INADDR_ANY) ;
}
cout <<"server correctement initialise" << endl;
return 0;
}
DWORD WINAPI server::ClientThread(void * p)
{
struct thread_param *Obj = (struct thread_param *) p ;
server *s = Obj->ser;
cout << "thread client start" << endl;
char buffer[100];
//**** sent ****
strcpy(buffer, "coucou n");
send(Obj->soc, buffer,strlen(buffer), 0);
cout<<"message envoye"<<endl;
int reponse = 0;
do
{
// cout<<"******** reception ...********"<<endl;
reponse = recv(Obj->soc, buffer, sizeof(buffer), 0);
cout<<"reponse"<<reponse<<endl;
buffer[reponse]=' ';
cout<<"msg recu "<<buffer<<endl;
}while(reponse=0);
return 0;
}
int server::start ()
{
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
HANDLE hProcessThread;
struct thread_param p;
ListeningSocket = socket(AF_INET, SOCK_STREAM, 0);
if(ListeningSocket == INVALID_SOCKET)
{
perror("socket()");
exit(-1);
}
cout <<"socket correctement creee" << endl;
if( bind( ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof( ServerAddr ) ) == SOCKET_ERROR )
{
cerr<<"bind a echoue avec l'erreur "<< WSAGetLastError()<< endl;
cerr<<"Le port est peut-être deja utilise par un autre processus "<< endl;
return 1;
}
cerr<<"Bind... "<< endl;
if( listen( ListeningSocket, 5 ) == SOCKET_ERROR )
{
cerr<<"listen a échoué avec l'erreur "<< WSAGetLastError()<< endl;
return 1;
}
cout <<"serveur demarre : a l ecoute du port "<<port<< endl;
running = true;
ClientAddrLen = sizeof( ClientAddr );
while(running)
{
if(Newconnection = accept(ListeningSocket, (struct sockaddr *)&ClientAddr, &ClientAddrLen) == INVALID_SOCKET)
{
cout<<"accept a echoue avec l erreur "<< WSAGetLastError() << endl;
return 1;
}
p.ser=this;
p.soc=Newconnection;
cout<<"client connecte..."<<endl;
hProcessThread = CreateThread(NULL, 0,ClientThread, &p,0,NULL);
if ( hProcessThread == NULL )
{
cerr <<"CreateThread a échoué avec l'erreur "<<GetLastError()<< endl;
}
}
closesocket( ListeningSocket );
WSACleanup();
return 0;
}
不能像这样将成员函数作为函数指针传递给c风格的函数。您可以使用一个静态函数,它接受一个指向this
的指针,然后强制转换对象,并从静态函数内部调用您的成员函数。或者,使用std::thread更好。
相关文章:
- Java 客户端C++服务器数据发送/接收问题
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- 从 tcp 服务器打开 8MP H264 流时出现问题
- C++中从客户端到服务器的数据传输问题
- UDP 客户端到 UDP 服务器的问题,出现 10057 错误
- C++机器人程序(我的私人服务器)出现问题
- Caffe 安装问题,远程服务器,ld 找不到 -<package>
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- C 多线程TCP服务器问题
- 套接字 TCP 服务器程序问题
- Linux TCP服务器问题C++
- 连接到IRC服务器时出现问题
- 服务器/客户端TCP异步(winsock)//FD_WRITE问题
- 基本服务器/客户端代码出现问题
- 通过套接字发送的图像流-服务器死锁问题
- 使用C++CGI解决服务器错误500时遇到问题
- C++:服务器上的 boost::文件系统问题(区域设置::facet::_S_create_c_locale 名称无效
- omniORB C++服务器,Java 客户机在运行应用程序时出现问题
- 提升 HTTP 服务器问题
- 问题4.8.4如何检查http服务器上是否存在文件