Får felmeddelande : argument of type `void*(Client::)(void*)' does not match `void*(*)(void*)' Helt "enkelt" vad den säger. En funktionVad är fel? (pthreads)
i client.cpp
*client.h*
#pragma once
#include <windows.h>
#include <winsock.h>
#include <pthread.h>
#include <iostream>
#include <signal.h>
#include <stdio.h>
using namespace std;
class Client
{
private:
SOCKET sock;
SOCKET client;
struct sockaddr_in ser;
struct sockaddr addr;
int port;
char i_buffer[256];//in buffer
char o_buffer[256];//out buffer
u_long b;//1
pthread_t in_thread;
pthread_t out_thread;
int rt,st;
WSADATA data;
public:
Client();
~Client();
void set_ip(string IP);
void set_port(int port);
void * recv_thread(void *);
void * send_thread(void *);
void startup();
void cleanup();
};
*client.cpp*
#include "client.h"
Client::Client()
{
b = 1;
rt=1;
st=2;
ser.sin_family=AF_INET;
ser.sin_port=2800;
ser.sin_addr.s_addr=inet_addr("127.0.0.1");
}
Client::~Client(){};
void * Client::recv_thread(void *)
{
bool quit=false;
int result=0;
while(quit==false)
{
for(int i=0; i < 256; i++)
{
i_buffer[i] = '\0';
}
result=recv(sock,i_buffer,256,0); //Recive Data
if(result == 0)
{
cout << "SOCKET ERROR - DISCONNECTING!" << endl;
closesocket(sock);
WSACleanup();
quit=true;
}
}
pthread_exit(NULL);
}
void * Client::send_thread(void *)
{
int res=0;
while(true)
{
cout << "\n> ";
gets(o_buffer);
res = send(sock, o_buffer, strlen(o_buffer), 0);
}
pthread_exit(NULL);
}
void Client::startup()
{
int res=0;
memcpy(&addr,&ser,sizeof(SOCKADDR_IN));
res = WSAStartup(MAKEWORD(1,1),&data); //Start Winsock
/* cout<<"\n\nWSAStartup"
<<"\nVersion: "<<data.wVersion
<<"\nDescription: "<<data.szDescription
<<"\nStatus: "<<data.szSystemStatus<<endl;
*/
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //Create the socket
if(sock==INVALID_SOCKET )
{
//cout << "Invalid Socket " << endl;
}
else if(sock==SOCKET_ERROR)
{
//cout << "Socket Error)" << endl;
}
else
{
//cout<<"Socket Established"<<endl;
}
res=connect(sock,&addr,sizeof(addr)); //Connect to the server
if(res !=0 )
{
//cout << "SERVER UNAVAILABLE" << endl;
}
else
{
//cout<<"\nConnected to Server: ";
memcpy(&ser,&addr,sizeof(SOCKADDR));
}
ioctlsocket(sock,FIONBIO,&b);
/*FEL PÅ DENNA RAD*/ rt=pthread_create(&in_thread, NULL, send_thread,(void*)NULL);
}
void Client::cleanup()
{
WSACleanup();
}
Sv: Vad är fel? (pthreads)
void * f(void* k)
är inte samma sak som en funktion
void * C::f(void* k)
Utan du måste ha exakt en variant av det första slaget. Problemet med det är ju ganska uppenbar. Standardprincipen är att använda sig av mem_fun, men jag är jävligt skeptisk till om det fungerar i det här fallet.
I så fall ska du ändra anropet
rt=pthread_create(&in_thread, NULL, send_thread,(void*)NULL);
till något i stil med:
rt=pthread_create(&in_thread, NULL, mem_fun(&Client::send_thread),(void*)NULL);
Sen ska du fråga dig vilken Client det är som ska anropas... Det känns inte helt hundra. En funktion är alltid en funktion, men en metod beror på vilken klass den är medlem av.
Om inte det funkar får du göra något i stil med att skapa en "separat" funktion som hanterar det.
Och ytterligare ett alternativ, som är lite elegantare, är att försöka använda Thread-klasser istället. Kolla på boost.org för lite najs klasser som skulle kunna funka. Det borde vara det enklaste.