In C/C++ it is going to be harder to do complex things such as networking. Heres some code that i've made that might help you with sockets:
Socket.h
Code:
#ifndef SOCKETH
#define SOCKETH
#include <Winsock2.h>
#include <string>
using namespace std;
namespace Socket
{
class IpAddress
{
private:
in_addr addr;
public:
IpAddress(const string& ip) {
addr.s_addr = inet_addr(ip.c_str());
}
IpAddress(unsigned int ip = 0) {
addr.s_addr = ip;
}
IpAddress(in_addr ip) {
addr = ip;
}
unsigned int ToLong() const {
return addr.s_addr;
}
string ToString() const {
return inet_ntoa(addr);
}
static IpAddress ResolveHost(const string& hostName);
};
IpAddress GetSocketIp(int socketId);
int CreateTcpSocket();
int CreateUdpSocket();
bool TcpConnect(int socketId, const IpAddress& ipAddress, int port);
bool UdpBind(int socketId, int port);
int SendBytes(int socketId, const char* data, size_t dataSize, const IpAddress& ipAddress = 0, int port = 0);
int ReceiveBytes(int socketId, char* data, size_t dataSize);
int ReceiveLine(int socketId, char* data, size_t dataSize);
void StartWinsock();
void EndWinsock();
}
#endif // SOCKETH
Socket.cpp
Code:
#include <winsock.h>
#include "Socket.h"
namespace Socket
{
sockaddr sendAddr;
int sendAddrSize = sizeof(sendAddr);
IpAddress IpAddress::ResolveHost(const string& hostName)
{
sockaddr_in addr;
hostent* hostEntry;
if((hostEntry = gethostbyname(hostName.c_str())) == NULL)
return IpAddress();
addr.sin_addr = *((in_addr*)*hostEntry->h_addr_list);
return addr.sin_addr.s_addr;
}
IpAddress GetSocketIp(int socketId)
{
SOCKADDR_IN addr;
int addrLen = sizeof(addr);
if(getpeername(socketId, (SOCKADDR *)&addr, &addrLen) == -1)
return IpAddress();
return addr.sin_addr;
}
int CreateTcpSocket()
{
return socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
}
int CreateUdpSocket()
{
return socket(AF_INET, SOCK_DGRAM, 0);
}
bool TcpConnect(int socketId, const IpAddress& ipAddress, int port)
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ipAddress.ToLong();
addr.sin_port = htons((unsigned short)port);
if(connect(socketId, (sockaddr*)&addr, sizeof(addr)) == -1)
return false;
return true;
}
bool UdpBind(int socketId, int port)
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons((unsigned short)port);
if(bind(socketId,(SOCKADDR *)&addr, sizeof(addr)) == -1)
return false;
return true;
}
int SendBytes(int socketId, const char* data, size_t dataSize, const IpAddress& ipAddress, int port)
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons((unsigned short)port);
addr.sin_addr.s_addr = ipAddress.ToLong();
return sendto(socketId, data, dataSize, 0, (sockaddr *)&addr, sizeof(addr));
}
int ReceiveBytes(int socketId, char* data, size_t dataSize)
{
sockaddr sendAddr;
int sendAddrSize = sizeof(sendAddr);
return recvfrom(socketId, data, dataSize, 0, (sockaddr *)&sendAddr, &sendAddrSize);
}
int ReceiveLine(int socketId, char* data, size_t dataSize)
{
char byte;
unsigned int recvCount = 0;
memset(data, 0, dataSize);
while(recvCount < dataSize && recv(socketId, &byte, 1, 0) > 0)
{
if(byte != '\n')
data[recvCount++] = byte;
else break;
}
return recvCount;
}
void StartWinsock()
{
#ifdef WIN32
WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);
#endif
}
void EndWinsock()
{
#ifdef WIN32
WSACleanup();
#endif
}
}
main.cpp
Code:
#include <cstdio>
#include "Socket.h"
int main(int argc, char* argv[])
{
Socket::StartWinsock();
int socketId = Socket::CreateTcpSocket();
if(Socket::TcpConnect(socketId, Socket::IpAddress::ResolveHost("www.google.com.au"), 80))
{
printf("Connected to: %s\n", Socket::GetSocketIp(socketId).ToString().c_str());
char text[] = "GET / HTTP/1.1\n"
"Host: www.google.com.au\n"
"Connection: close\n"
"\n";
if(Socket::SendBytes(socketId, text, strlen(text)))
{
char recvLine[0xFFFF];
printf("Sent...awaiting reply\n");
while(Socket::ReceiveLine(socketId, recvLine, sizeof(recvLine)) > 0)
printf("Line: %s\n", recvLine);
}
}
Socket::EndWinsock();
return 0;
}