Post by aphoticgenesis on Apr 17, 2010 18:05:24 GMT -5
This is example with winsock that shows a connection between a client and server
#include <winsock2.h>
#include <cstdio>
#include <iostream>
#include <string>
#if defined(_MSC_VER)
#pragma comment(lib, "ws2_32.lib")
#endif
#define LAST_ERROR GetLastError()
#define UDP IPPROTO_UDP
#define TCP IPPROTO_TCP
BOOL server(unsigned short, int);
BOOL client(char*, unsigned short, int);
int main() {
std::string mode, hostname;
int serverport, clientport;
while(TRUE) {
std::cout << "mode: ";
std::cin >> mode;
if(mode == "server") {
std::cout << "port: ";
std::cin >> serverport;
if(server((unsigned short)serverport, 0) != TRUE) {
printf("server failed\n");
}
} else if(mode == "client") {
std::cout << "hostname: ";
std::cin >> hostname;
std::cout << "port: ";
std::cin >> clientport;
if(client((char*)hostname.c_str(), (unsigned short)clientport, 0) != TRUE) {
printf("client failed\n");
}
} else {
printf("invalid mode\n");
}
}
return(0);
}
BOOL server(unsigned short port, int proto) {
int error, serversocket, clientsocket;
WSAData wsaData;
error = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(error == SOCKET_ERROR) {
printf("error starting winsock: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("winsock started\n");
}
serversocket = socket(AF_INET, SOCK_STREAM, proto);
if(serversocket == SOCKET_ERROR) {
printf("error opening socket: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("socket %d opened\n", serversocket);
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
error = bind(serversocket, (sockaddr*)&server, sizeof(server));
if(error == SOCKET_ERROR) {
printf("error binding socket: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("socket binded\n");
}
error = listen(serversocket, 5);
if(error == SOCKET_ERROR) {
printf("error listening: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("waiting for clients...\n");
}
clientsocket = accept(serversocket, 0, 0);
if(clientsocket == SOCKET_ERROR) {
printf("error: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("client accepted at sock %d\n", clientsocket);
}
closesocket(serversocket);
printf("socket %d closed\n", serversocket);
WSACleanup();
printf("winsock cleanup\n");
system("PAUSE");
return TRUE;
}
BOOL client(char *szhostname, unsigned short port, int proto) {
int error, clientsocket;
WSAData wsaData;
error = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(error == SOCKET_ERROR) {
printf("error starting winsock: %d\n", (int)LAST_ERROR);
return FALSE;
} else{
printf("winsock started\n");
}
clientsocket = socket(AF_INET, SOCK_STREAM, proto);
if(clientsocket == SOCKET_ERROR) {
printf("error opening socket: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("socket %d opened\n", clientsocket);
}
struct hostent *host;
host = gethostbyname(szhostname);
if(host == NULL) {
printf("error host not found: %d\n", (int)LAST_ERROR);
return FALSE;
} else {
printf("host found\n");
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = *(unsigned long*)host->h_addr;
error = connect(clientsocket, (sockaddr*)&server, sizeof(server));
if(error == SOCKET_ERROR) {
printf("error connecting to server: %d\n", (int)LAST_ERROR);
} else {
printf("connected to server\n");
}
closesocket(clientsocket);
printf("socket %d closed\n", clientsocket);
WSACleanup();
printf("winsock cleanup\n");
system("PAUSE");
return TRUE;
}