Here are two examples I created and use as a reference, maybe they are of help:
/*
** Playing around with WinSockets
*/
#include <stdio.h>
#include <winsock.h>
int main (int argc, char **argv){
WORD wsaVersion;
wsaVersion = MAKEWORD(2,2);
WSADATA wsaData;
SOCKET sock1;
int wsaerr;
wsaerr = WSAStartup(wsaVersion, &wsaData);
if (wsaerr != 0){
printf("\nWinsock not found");
return -1;
}
printf("Winsock found");
sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock1 == INVALID_SOCKET){
printf("Initializing socket failed: %ld\n", WSAGetLastError());
WSACleanup();
return -1;
}
printf("\nSocket() works");
WSACleanup();
return 0;
}
#include <stdio.h>
#include <winsock2.h>
int main(int argc, char **argv){
WORD wsaVersion = MAKEWORD(2,2);
WSADATA wsaData;
int wsaerr;
wsaerr = WSAStartup(wsaVersion, &wsaData);
if (wsaerr){
printf("WSAStartup failed, exiting.");
return -1;
}
SOCKET somesock;
somesock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (somesock == INVALID_SOCKET){
printf("Socket() failed, exiting.");
WSACleanup();
return -1;
}
struct sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(12344);
if (bind(somesock, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR){
printf("Bind() failed, exiting.");
closesocket(somesock);
WSACleanup();
return -1;
}
closesocket(somesock);
WSACleanup();
return 0;
}
Here's are tiny server/client applications. I don't guarrantee they work or are the holy grail of winsock programming, but if they still work then they are good references. ;-)
basicServer.c
/*BasicServer.c*/
#include <stdio.h>
#include <winsock.h>
#include <string.h>
#define BUFFERSIZE 511
int main(int argc, char **argv){
if (argc < 3){
printf("Usage: %s <message to send to client> <ip to listen to>\n", argv[0]);
return -1;
}
SOCKET sock, accepsock = SOCKET_ERROR;
WSADATA wsaData;
WORD wsaVersion = MAKEWORD(2,2);
int sizeOf, wsaerr;
struct sockaddr_in sockinfo, clientinfo;
sockinfo.sin_family = AF_INET;
sockinfo.sin_addr.s_addr = inet_addr(argv[2]);
sockinfo.sin_port = htons(12344);
int sentB, recvB = SOCKET_ERROR;
char sendbuf[BUFFERSIZE];
lstrcpy(sendbuf, argv[1]);
char recvbuf[BUFFERSIZE] = "";
/*WSAStartup(<WORD req_version>, <*WSADATA>)
Initializes Ws2_32.dll, aka the winsock dll.*/
if(WSAStartup(wsaVersion, &wsaData)){
printf("Fatal error: WSAStartup: %d", WSAGetLastError());
return -1;
}
/*socket(<addr family> (AF_INET), <sock type> (SOCK_STREAM/DGRAM), <protocol> (TCPPROTO_IP));
Makes the socket a socket with some info as to what type of socket it should be.*/
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
printf("\nFatal error: Socket: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
/*bind(<socket>, <*sockaddr>, sizeof(<sockaddr>));
Need to call this in order to be able to listen() or connect()*/
if(bind(sock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR){
printf("\nFatal error: Bind: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
/*listen(<socket>, <backlog>);
Puts socket in listening state.*/
if (listen(sock, SOMAXCONN) == SOCKET_ERROR){
printf("\nFatal error: Listen: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
printf("\nDone: Listening for connections.");
sizeOf = sizeof(clientinfo);
while(accepsock == SOCKET_ERROR)
accepsock = accept(sock,(SOCKADDR*)&clientinfo, &sizeOf);
printf("\n %s connected", inet_ntoa(clientinfo.sin_addr));
sock = accepsock;
sentB = send(sock, sendbuf, strlen(sendbuf), 0);
if (sentB == SOCKET_ERROR){
printf("\nServer: Error: Send: %d", WSAGetLastError());
}
printf("\nServer: Sent data:\n Size: %d\n Data: \"%s\"", sentB, sendbuf);
recvB = recv(sock, recvbuf, BUFFERSIZE, 0);
if (recvB < 0){
printf("\nServer: Error: Recv: %d", WSAGetLastError());
}
else if(recvB == 0){
printf("Connection closed.");
closesocket(sock);
WSACleanup();
}
printf("\nServer: Recieved data:\n Size: %d\n Data: \"%s\"", recvB, recvbuf);
printf("\nFinished without errors, shutting down");
shutdown((SOCKET)socket, SD_BOTH);
closesocket(sock);
WSACleanup();
return 0;
}
basicClient.c
/*BasicClient.c*/
#include <stdio.h>
#include <winsock.h>
#include <string.h>
#define BUFFERSIZE 511
int main(int argc, char *argv[]){
if (argc < 3){
printf("Usage: %s <message to send to server> <server IP>\n", argv[0]);
return -1;
}
SOCKET sock, accepsock = SOCKET_ERROR;
WSADATA wsaData;
WORD wsaVersion = MAKEWORD(2,2);
int sizeOf, wsaerr;
struct sockaddr_in sockinfo;
sockinfo.sin_family = AF_INET;
if (argv[2][strlen(argv[2])-1] == '\n')
argv[2][strlen(argv[2])-1] == '\0';
if(isdigit(argv[2][0]))
sockinfo.sin_addr.s_addr = inet_addr(argv[2]);
else return -1;
sockinfo.sin_port = htons(12344);
int sentB, recvB = SOCKET_ERROR;
char sendbuf[BUFFERSIZE];
lstrcpy (sendbuf, argv[1]);
char recvbuf[BUFFERSIZE] = "";
/*WSAStartup(<WORD req_version>, <*WSADATA>)
Initializes Ws2_32.dll, aka the winsock dll.*/
if(WSAStartup(wsaVersion, &wsaData)){
printf("Fatal error: WSAStartup: %d", WSAGetLastError());
return -1;
}
/*socket(<addr family> (AF_INET), <sock type> (SOCK_STREAM/DGRAM), <protocol> (TCPPROTO_IP));
Makes the socket a socket with some info as to what type of socket it should be.*/
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
printf("\nFatal error: Socket: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
if(connect(sock, (SOCKADDR*)&sockinfo, sizeof(sockinfo))){
printf("\nClient: Fatal error: Connect: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
sentB = send(sock, sendbuf, strlen(sendbuf), 0);
if (sentB == SOCKET_ERROR){
printf("\nClient: Fatal error: Send: %d", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
printf("\nClient: Sent data:\n Size: %d\n Data: \"%s\"", sentB, sendbuf);
recvB = recv(sock, recvbuf, BUFFERSIZE, 0);
if (recvB < 0){
printf("\nClient: Error: Recv: %d", WSAGetLastError());
}
else if(recvB == 0){
printf("Connection closed.");
closesocket(sock);
WSACleanup();
}
printf("\nClient: Recieved data:\n Size: %d\n Data: \"%s\"", recvB, recvbuf);
printf("\nFinished without errors, shutting down");
shutdown((SOCKET)socket, SD_BOTH);
closesocket(sock);
WSACleanup();
return 0;
}
Don't forget to link with the winsocket library! (in MinGW, that's ws2_32.a, pass the parameter: -lws2_32 when compiling)