Ho cercato di farmi una lib socket per Lin-Win e questo il risultato:
codice:
/// The Os inclusion
#ifdef WINDOWS
#include <Winsock2.h>
#include <windows.h>
#elif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#endif
#include <string>
class WinClientSock
{
std::string addr;
#ifdef WINDOWS
SOCKET sock_fd; /// the win socket
#elif
int sock_fd; /// the lin socket
#endif
struct sockaddr_in temp; /// the sockaddr structure
struct hostent *h; /// the host structure
int port;
public:
WinClientSock();
WinClientSock(const std::string addr, int port);
~WinClientSock();
int Open();
void Exit();
const char *getHost()
{
return addr.c_str();
};
const int getPort()
{
return port;
};
int Receve(char *buf);
int Send(char * buff);
};
WinClientSock::WinClientSock()
{
addr = "localhost";
/// defining port
#ifdef DEF_PORT
port = 6000;
#elifdef DEF_PORT
port = DEF_PORT;
#endif
}
WinClientSock::WinClientSock(const std::string addr, int port)
{
this->port = port;
this->addr = addr;
}
WinClientSock::~WinClientSock()
{
Exit();
}
int WinClientSock::Open()
{
int ret;
#ifdef WINDOWS
WSADATA wsaData;
WORD version;
int error;
version = MAKEWORD( 2, 0 );
error = WSAStartup( version, &wsaData );
/* check for error */
if ( error != 0 )
{
return -1;
}
/* check for correct version */
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup();
return -1;
}
sock_fd = socket( AF_INET, SOCK_STREAM, 0 );
h = gethostbyname(addr.c_str());
temp.sin_family = AF_INET;
temp.sin_addr.s_addr = ((struct in_addr *)(h->h_addr))->s_addr;
temp.sin_port = htons(port);
if ( connect( sock_fd, (sockaddr*)&temp, sizeof(temp) ) == SOCKET_ERROR )
{
/* could not connect to server */
ret = -1;
}
else
{
ret = sock_fd;
}
#elif
temp.sin_family = AF_INET;
temp.sin_port = htons(PORT);
h = gethostbyname(addr.c_str());
if (0 == h) return -1;
bcopy(h->h_addr,&temp.sin_addr,h->h_length);
sock_fd = socket(AF_INET,SOCK_STREAM,0);
errore = connect(sock_fd,(struct sockaddr*) &temp, sizeof(temp));
if(errore == 0)
{
ret = sock_fd;
}
else
{
ret = -1;
}
#endif
return ret;
}
void WinClientSock::Exit()
{
#ifdef WINDOWS
closesocket(sock_fd);
WSACleanup();
#elif
close(sock_fd);
#endif
}
int WinClientSock::Receve(char *buf)
{
if(recv(sock_fd, buf, strlen(buf), 0 ) == 0)
{
return -1;
}
}
int WinClientSock::Send(char *buf)
{
if(send(sock_fd, buf, strlen(buf), 0 ) == 0)
{
return -1;
}
}
Il problema è che provandola:
codice:
#include <iostream>
#include <cstring>
#include "WinSockClient.hpp"
using namespace std;
int main(int argc, char *argv[])
{
WinClientSock sk("http://www.ngi.it", 23);
SOCKET client = (SOCKET) sk.Open();
if(-1 != client)
{
cout << "Open Ok \n";
char * buffer = new char[32];
/*
if(sk.Receve(buffer) == -1)
{
cout << "Error in recv\n";
}
else
{
cout << buffer;
}
*/
if(sk.Send(buffer) == -1)
{
cout << "Error in send\n";
}
else
{
cout << "Ok\n";
}
delete[] buffer;
}
char c;
cin >> c;
return 0;
}
Mi da errore di memoria che doveva essere read
Why???
Tnk 10000000000000