WSAGetLastError() returns 10057 ,meaning socket error, on the recv() function though i am connected.
And the recv() function isnt blocking it loops around.
Server and client in the same code.
Thanks for any suggestions.
Code:
#include <windows.h>
#include <WinSock2.h>
#include <iostream>
using namespace std;
const int STRLEN = 256; char message[STRLEN] = {0};
unsigned int port = 666;
char recMessage[STRLEN] = {0};
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
class Socket
{
protected:
WSADATA wsaData;
SOCKET mySocket;
SOCKET myBackup;
SOCKET acceptSocket;
sockaddr_in sockad;
public:
Socket();
~Socket();
bool SendData( char* );
bool RecvData( char*, int );
void CloseConnection();
void GetAndSendMessage();
};
class ClientSocket : public Socket //Inheritance
{
public:
void ConnectToServer( const char *ipAddress, int port );
}; ClientSocket sockClient;
void ClientSocket::ConnectToServer( const char *ipAddress, int port )
{
sockad.sin_family = AF_INET;
sockad.sin_addr.s_addr = inet_addr( ipAddress );
sockad.sin_port = htons( port );
if ( connect( mySocket, (SOCKADDR*) &sockad, sizeof( sockad ) ) == SOCKET_ERROR )
{
cerr << "ClientSocket: Failed to connect\n";
system("pause");
WSACleanup();
exit(13);
}
cout << "\nCONNECTED!\n\n";
}
void Socket::GetAndSendMessage() //Member functions
{
cin.ignore();
message[0] = '\0';
cout << "You > ";
cin.get( message, STRLEN );
SendData( message );
}
bool Socket::SendData( char *buffer )
{
send( mySocket, buffer, strlen( buffer ), 0 );
return true;
}
bool Socket::RecvData( char *buffer, int size )
{
int i = recv( mySocket, buffer, size, 0 );
cout<<WSAGetLastError()<<"\r\n";
cout <<i<< "\n";
buffer[i] = '\0';
return true;
}
Socket::Socket()
{
if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
{
cerr << "Socket Initialization: Error with WSAStartup\n";
system("pause");
WSACleanup();
exit(10);
}
//Create a socket
mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( mySocket == INVALID_SOCKET )
{
cerr << "Socket Initialization: Error creating socket" << endl;
system("pause");
WSACleanup();
exit(11);
}
myBackup = mySocket;
}
Socket::~Socket()
{
WSACleanup();
}
/////////////////////////////////////////////////////////////////////////
class ServerSocket : public Socket //Inheritance
{
public:
void Bind( int port );
void Listen();
void StartHosting( int port );
}; ServerSocket sockServer;
void ServerSocket::StartHosting( int port )
{
Bind( port );
Listen();
}
void ServerSocket::Bind( int port )
{
sockad.sin_family = AF_INET;
sockad.sin_addr.s_addr = inet_addr( "0.0.0.0" );
sockad.sin_port = htons( port );
if ( bind ( mySocket, (SOCKADDR*) &sockad, sizeof( sockad) ) == SOCKET_ERROR )
{
cerr << "ServerSocket: Failed to connect\n";
system("pause"); WSACleanup(); exit(14);
}
}
void ServerSocket::Listen()
{
if ( listen ( mySocket, 1 ) == SOCKET_ERROR )
{
cerr << "ServerSocket: Error listening on socket\n";
system("pause");
WSACleanup();
exit(15);
}
acceptSocket = accept( myBackup, NULL, NULL );
while ( acceptSocket == SOCKET_ERROR )
{
acceptSocket = accept( myBackup, NULL, NULL );
}
mySocket = acceptSocket;
cout << "\nCONNECTED!\n\n";
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
int main()
{
string choice;
string ipAddress;
while(1){
cout << "1) Client" << endl;
cout << "2) Server" << endl;
cin >> choice;
/***************************************CLIENT***************************************/
if ( choice == "1" )
{
cout << "ATTEMPTING TO CONNECT..." << endl;
sockClient.ConnectToServer( "127.0.0.1", port );
while (1)
{
sockClient.GetAndSendMessage();
}
sockClient.CloseConnection();
}
/****************************************SERVER***************************************/
else if ( choice == "2" )
{
//(HANDLE)_beginthreadex(NULL, 0, LISTENandACCEPT , NULL, 0, &Th2);
cout << "\t--------------\n" << endl;
cout << "\t****SERVER****\n" << endl;
cout << "\t--------------\n" << endl;
cout << "WAITING FOR CLIENT..." << endl;
sockServer.StartHosting( port );
while(1)
{
sockClient.RecvData( recMessage, STRLEN );
cout << "Friend > " << recMessage << endl; Sleep(1999);
}
}
else cout << "\nType 1 or 2 Please!\n\n";
}
}