|
Post by aphoticgenesis on Apr 20, 2010 7:31:54 GMT -5
#include <winsock2.h> #include <iostream>
#if defined(_MSC_VER) #pragma comment(lib, "ws2_32.lib") #endif
#define NET_SERVER_SOCK 0 #define NET_CLIENT_SOCK 1 #define NET_MAX_SOCK 1 #define NET_PROTO_TCP IPPROTO_TCP #define NET_PROTO_UDP IPPROTO_UDP #define NET_MAX_INSTANCES 10 #define NET_SOCK_ERROR SOCKET_ERROR #define NET_LAST_ERROR GetLastError()
typedef unsigned short NETushort;
typedef struct SServerCon { NETushort uPort; int iProtocol; };
typedef struct SClientCon { char *szHostName; NETushort uPort; int iProtocol; };
class CNet { public: bool Open(); int OpenServer(SServerCon&); int OpenClient(SClientCon&); void Close(int); private: int m_iError; WSAData m_wsaData; int m_iSock[NET_MAX_SOCK]; };
bool CNet::Open() { m_iError = WSAStartup(MAKEWORD(2, 2), &m_wsaData); if(m_iError == NET_SOCK_ERROR) { return false; } return true; }
int CNet::OpenServer(SServerCon &ServerCon) { m_iSock[NET_SERVER_SOCK] = socket(AF_INET, SOCK_STREAM, ServerCon.iProtocol); if(m_iSock[NET_SERVER_SOCK] == NET_SOCK_ERROR) { return NET_LAST_ERROR; }
struct sockaddr_in Server; Server.sin_family = AF_INET; Server.sin_port = htons(ServerCon.uPort); Server.sin_addr.s_addr = INADDR_ANY; m_iError = bind(m_iSock[NET_SERVER_SOCK], (sockaddr*)&Server, sizeof(Server)); if(m_iError == NET_SOCK_ERROR) { return NET_LAST_ERROR; }
m_iError = listen(m_iSock[NET_SERVER_SOCK], 5); if(m_iError == NET_SOCK_ERROR) { return NET_LAST_ERROR; } else { std::cout << "Waiting for clients...." << std::endl; }
int ClientSock; ClientSock = accept(m_iSock[NET_SERVER_SOCK], 0, 0); if(ClientSock == NET_SOCK_ERROR) { return NET_LAST_ERROR; } else { std::cout << "Client on sock " << ClientSock << " accepted" << std::endl; } closesocket(m_iSock[NET_SERVER_SOCK]); WSACleanup(); return(1); }
int CNet::OpenClient(SClientCon &ClientCon) { m_iSock[NET_CLIENT_SOCK] = socket(AF_INET, SOCK_STREAM, ClientCon.iProtocol); if(m_iSock[NET_CLIENT_SOCK] == NET_SOCK_ERROR) { return NET_LAST_ERROR; }
struct hostent *host; host = gethostbyname(ClientCon.szHostName); if(host == NULL) { return NET_LAST_ERROR; }
struct sockaddr_in Server; Server.sin_family = AF_INET; Server.sin_port = htons(ClientCon.uPort); Server.sin_addr.s_addr = *(unsigned long*)host->h_addr; m_iError = connect(m_iSock[NET_CLIENT_SOCK], (sockaddr*)&Server, sizeof(Server)); std::cout << "Connecting to server...." << std::endl; if(m_iError == NET_SOCK_ERROR) { return NET_LAST_ERROR; } else { std::cout << "Connected to server" << std::endl; } closesocket(m_iSock[NET_CLIENT_SOCK]); WSACleanup(); return(1); }
void CNet::Close(int iReturn) { exit(iReturn); }
int main(int argc, char *argsv[]) { unsigned int iError; CNet Net[NET_MAX_INSTANCES]; SClientCon Client = { "localhost", 1000, 0 }; SServerCon Server = { 1000, 0 }; std::string szMode; Net[0].Open(); while(true) { std::cout << "Mode: "; std::cin >> szMode; if(szMode == "Server") { iError = Net[0].OpenServer(Server); if(iError == NET_LAST_ERROR) { std::cout << "Server failed(" << iError << ")" << std::endl; } } else if(szMode == "Client") { iError = Net[0].OpenClient(Client); if(iError == NET_LAST_ERROR) { std::cout << "Client failed(" << iError << ")" << std::endl; } } else { std::cout << "Invalid mode" << std::endl; } } Net[0].Close(0); }
|
|