受信部分をスレッドにしようとしたのですが、
以下のようなエラーが出てきました。
WinVista Borland C++ Compilerにてコンパイルしました
====以下エラー======================================================================
エラー E2034 serv.cpp 76:
'unsigned long (__stdcall * (_closure )(void *))(void *)' 型は
'unsigned long (__stdcall *)(void *)' 型に変換できない
(関数 TcpListener01::StartRecv() )
エラー E2342 serv.cpp 76: パラメータ 'lpStartAddress' は
unsigned long (__stdcall *)(void *) 型として定義されているので
void は渡せない(関数TcpListener01::StartRecv() )
===エラーここまで====================================================================
メンバ関数がスレッドのエントリポイントとして使えないことが原因
だと考えています。この問題を、解決する方法はありますでしようか?
それとも設計が根本からおかしいのでしょうか?
#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
class TcpListener01 {
public:
WSADATA wsaData;
DWORD dwParam;
struct sockaddr_in addr;
struct sockaddr_in client;
SOCKET sock;
SOCKET ClientSock;
char port[10],target[2000];
HANDLE hThread;
int InitWSAdata(){
if(WSAStartup(MAKEWORD(2,0), &wsaData)==0)return -1;
return 0;
}
int CreateSocket(){
sock= socket(AF_INET,SOCK_STREAM,0);
if (sock == INVALID_SOCKET)return -1;
}
SOCKET Accept(char *port){
int nport;
nport=atoi(port);
if(nport==0)return -1;
SOCKET s;
addr.sin_family = AF_INET;
addr.sin_port = htons(nport);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
listen(sock, 5);
int len = sizeof(client);
ClientSock = accept(sock, (struct sockaddr *)&client, &len);
return 0;
}
DWORD WINAPI RecvThread(LPVOID lpvoid) {
char buf[4096];
int ret,n,i,id;
id=(int)lpvoid;
printf("ThreadOpened\n");
BOOL Flag=TRUE;
while(Flag){
ret=recv(ClientSock,buf,2048,0);
if(ret>0){
//ゆくゆくはここはコールバックにしたい。
printf("%s\n",buf);
}
if(ret==0){
closesocket(ClientSock);
Flag=FALSE;
}
}
ExitThread(TRUE);
}
void StartRecv(){
//スレッドを起こす
hThread=CreateThread(NULL , 0 , RecvThread,(LPVOID)this, 0 , &dwParam);
}
//使わない
int Recv(char *buf,int size,int Flag){
int ret;
ret=recv( ClientSock,buf,size,Flag);
return ret;
}
int Send(char *buf,int size,int Flag){
int ret;
ret=send(ClientSock,buf,size,Flag);
return ret;
}
int CloseClientSock(){
closesocket(ClientSock);
}
int CloseServSock(){
closesocket(sock);
}
} TcpListener01 ;
int main(void)
{
class TcpListener01 serv;
char buf[1024],rec[1024];
serv.InitWSAdata();
serv.CreateSocket();
serv.Accept("5555");
printf("クライアントがきました");
for(;;)
{
memset(buf,'\0',sizeof(buf));
printf("送信メッセージ→");
gets(buf);
strcat(buf,"\0");
serv.Send(buf,strlen(buf),0);
serv.StartRecv();
strcat(buf,"\0");
printf("受信メッセージ→%s\n",buf);
}
// TCPセッションの終了
serv.CloseClientSock();
serv.CloseServSock();
// winsock2の終了処理
WSACleanup();
return 0;
}