UDP and TCP Socket Programming in C with Winsock: Sender and Receiver Examples

Classified in Computers

Written on in English with a size of 13.97 KB

UDP Sender 1

#include <winsock.h>
#include <stdio.h>

#define msg "This is a UDP message."
int main(int argc, int **argv)
{
WSADATA wsda; // Structure to store info
// returned from WSAStartup
struct hostent *host; // Used to store information
// retrieved about the server
char szMessage[80];
int iMessageLen;
int ret;
char szAddress[64];
int iPort;
SOCKET s; // Our UDP socket handle
SOCKADDR_IN addr; // The host's address

Check Arguments

if(argc != 3 ||
(argc==2 && strcmp((char *) &argv[1][0], "/?")==0))
{
printf("wsudpsnd server port\n");
printf(" server: the server to send the packet to\n");
printf(" port: the port on the remote server\n");
exit(1);
}

Copy the IP Address

strcpy(szAddress, (char *) &argv[1][0]);

Get the Remote Port

iPort = a2i((char *) &argv[2][0]);
if(iPort<0 || iPort>65563)
{
printf("Invalid port #! (%s)\n", argv[2]);
exit(1);
}

Copy the Pre-Defined Message into a Buffer

strcpy(szMessage, msg);
iMessageLen = strlen(szMessage);

Load Version 1.1 of Winsock

WSAStartup(MAKEWORD(1,1), &wsda);

UDP Sender 2

Create a UDP Socket

printf("Creating socket...");
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

Error Check

if(s == SOCKET_ERROR)
{
printf("Error\nCall to socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

Fill in the Host Information

addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = inet_addr(szAddress);
if (addr.sin_addr.s_addr == INADDR_NONE) // The address wasn't in numeric
// form, resolve it
{
host = NULL;
printf("Resolving host...");
host = gethostbyname(szAddress); // Get the IP address of the server
// and store it in host
if (host == NULL)
{
printf("Error\nUnknown host: %s\n", szAddress);
exit(1);
}
memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
printf("OK\n");
}

Ready to Send Data

printf("Sending packet...");
ret = sendto(s, szMessage, iMessageLen, 0, (struct sockaddr *) &addr, sizeof(addr));
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to sendto(s, szMessage, iMessageLen, 0, (SOCKADDR_IN *) &addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");
printf("\"%s\" sent to %s\n", szMessage, szAddress);

closesocket(s);
WSACleanup();
return 0;
}

UDP Receiver 1

#include <winsock.h>
#include <string.h>

int main(int argc, int **argv)
{

WSADATA wsda; // Structure to store info
// returned from WSAStartup
char szMessage[512];
int iMessageLen;
int ret;
char szAddress[64];
int iPort;
SOCKET s; // Our UDP socket handle
SOCKADDR_IN addr, // The local interface address
remote_addr; // The sender's address
int iRemoteAddrLen; // Contains the length of remote_addr, passed to recvfrom

Check Arguments

if (argc != 2 ||
(argc==2 && strcmp((char *) &argv[1][0], "/?")==0))
{
printf("wsudprcv port\n");
printf(" port: the port the server should listen to\n");
exit(1);
}

Get the Local Port

iPort = atoi((char *) &argv[1][0]);
if(iPort<0 || iPort>65563)
{
printf("Invalid port number! (%s)\n", argv[1]);
exit(1);
}
iMessageLen = 512; // Set to the length of szMessage buffer

Load Version 1.1 of Winsock

WSAStartup(MAKEWORD(1,1), &wsda);

Create a UDP Socket

printf("Creating socket...");
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

Error Check

if(s == SOCKET_ERROR)
{
printf("Error\nCall to socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

UDP Receiver 2

Fill in the Host Information

addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

printf("Binding socket...");
ret = bind(s, (struct sockaddr *) &addr, sizeof(addr));
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to bind(s, (struct sockaddr *) &addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

Ready to Receive Data

printf("Waiting for packet...");
iRemoteAddrLen = sizeof(remote_addr);
ret = recvfrom(s, szMessage, iMessageLen, 0, (struct sockaddr *) &remote_addr, &iRemoteAddrLen);
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to recvfrom(s, szMessage, iMessageLen, 0, (struct sockaddr *) &remote_addr, &iRemoteAddrLen); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
szMessage[ret] = '\0';
strcpy(szAddress, inet_ntoa(remote_addr.sin_addr));
printf("OK\n");
printf("\"%s\" received from %s\n", szMessage, szAddress);

closesocket(s);
WSACleanup();
return 0;
}

TCP Client 1

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MESSAGE "Hello, Server!\n"

int main(int argc, int **argv)
{
WSADATA wsda; // Structure to store info
// returned from WSAStartup
struct hostent *host; // Used to store information
// retrieved about the server
char szMessage[80];
int iMessageLen;
int ret;
char szInBuffer[128];
int iBufferLen;
char szAddress[64];
int iPort;
SOCKET s; // Our TCP socket handle
SOCKADDR_IN addr; // The host's address

Check Arguments

if(argc != 3 ||
(argc==2 && strcmp((char *) &argv[1][0], "/?")==0))
{
printf("wsclient server port\n");
printf(" server: the server to connect to\n");
printf(" port: the port on the remote server\n");
exit(1);
}

Copy the IP Address

strcpy(szAddress, (char *) &argv[1][0]);

Get the Remote Port

iPort = atoi((char *) &argv[2][0]);
if(iPort<0 || iPort>65563)
{
printf("Invalid port number! (%s)\n", argv[2]);
exit(1);
}

Copy the Pre-Defined Message into a Buffer

strcpy(szMessage, MESSAGE);
iMessageLen = strlen(szMessage);

TCP Client 2

Load Version 1.1 of Winsock

WSAStartup(MAKEWORD(1,1), &wsda);

Create a TCP Socket

printf("Creating socket...");
s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

Error Check

if (s == SOCKET_ERROR)
{
printf("Error\nCall to socket(AF_INET, SOCK_STREAM, IPPROTO_IP); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

Fill in the Host Information

addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = inet_addr(szAddress);
if (addr.sin_addr.s_addr == INADDR_NONE) // The address wasn't in numeric
// form, resolve it
{
host = NULL;
printf("Resolving host...");
host = gethostbyname(szAddress); // Get the IP address of the server
// and store it in host
if (host == NULL)
{
printf("Error\nUnknown host: %s\n", szAddress);
exit(1);
}
memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
printf("OK\n");
}

TCP Client 3

Connect to the Server

printf("Connecting to %s:%d...", szAddress, iPort);
ret = connect(s, (struct sockaddr *) &addr, sizeof(addr));
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to connect(s, (SOCKADDR) addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

Ready to Send Data

printf("Sending data...");
ret = send(s, szMessage, iMessageLen, 0);
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to send(s, szMessage, iMessageLen, 0) failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");
printf("\"%s\" sent to %s\n", szMessage, szAddress);

Receive Data

printf("Waiting for a response...");
ret = recv(s, szInBuffer, sizeof(szInBuffer), 0);
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to recv(s, szInBuffer, sizeof(szInBuffer), 0); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("Response received\n");
iBufferLen = ret; // recv() returns the number of bytes read
szInBuffer[iBufferLen] = '\0'; // Convert to C string

printf("Response received from %s:\n\"%s\"\n", szAddress, szInBuffer);

closesocket(s);
WSACleanup();
return 0;
}

TCP Server 1

#define MESSAGE "Hello, Client!\n"

#include <winsock.h>

int main(int argc, int **argv)
{
WSADATA wsda; // Structure to store information returned from
// WSAStartup
char szRepMessage[80]; // Store the reply message
int iMessageLen;
int ret; // Return values
char szInBuffer[128];
int iBufferLen;
int iPort, iAddrLen;
SOCKET sListen, sClient; // Our TCP socket handles
SOCKADDR_IN addr, // The local interface
remote_addr; // The address of the connecting host

Check Arguments

if(argc != 2 || (argc==2 && strcmp((char *) &argv[1][0], "/?")==0))
{
printf("wsserver port\n");
printf(" port: the listening port\n");
exit(1);
}

Get the Remote Port

iPort = atoi((char *) &argv[1][0]);
if(iPort<0 || iPort>65563) // 0 < iPort < 65563
{
printf("Invalid port number! (%s)\n", argv[1]);
exit(1);
}
strcpy(szRepMessage, MESSAGE);
iMessageLen = strlen(szRepMessage);

Load Version 1.1 of Winsock

WSAStartup(MAKEWORD(1,1), &wsda);

Create a TCP Socket

printf("Creating socket...");
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

Error Check

if(sListen == SOCKET_ERROR)
{
printf("Error\nCall to socket(AF_INET, SOCK_STREAM, IPPROTO_IP); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

TCP Server 2

printf("Binding socket to port %d...", iPort);

addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY); // Listen on any interface

ret = bind(sListen, (struct sockaddr *) &addr, sizeof(addr));

Error Check

if (ret == SOCKET_ERROR)
{
printf("Error\nCall to bind(sListen, (struct sockaddr *) &addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

printf("Putting socket into listening mode...");
ret = listen(sListen, 10); // Backlog 10

Error Check

if (ret == SOCKET_ERROR)
{
printf("Error\nCall to listen(sListen, 10); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");

printf("Waiting for connections (Press Ctrl-C to exit)...");
iAddrLen = sizeof(remote_addr);
sClient = accept(sListen, (struct sockaddr *) &remote_addr, &iAddrLen);

Error Check

if (sClient == SOCKET_ERROR)
{
printf("Error\nCall to accept(sListen, (struct sockaddr *) &remote_addr, &iAddrLen); failed with:\n%d\n", WSAGetLastError());
exit(1);
}

TCP Server 3

printf("%s connected\n", inet_ntoa(remote_addr.sin_addr));

Receive Data

printf("Waiting for a response...");
ret = recv(sClient, szInBuffer, sizeof(szInBuffer), 0);
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to recv(sClient, szInBuffer, sizeof(szInBuffer), 0); failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("Response received\n");
iBufferLen = ret; // recv() returns the number of bytes read
szInBuffer[iBufferLen] = '\0'; // Convert to C string
printf("Data received:\n%s\n", szInBuffer);

Ready to Send Data

printf("Sending reply...");
ret = send(sClient, szRepMessage, iMessageLen, 0);
if (ret == SOCKET_ERROR)
{
printf("Error\nCall to send(sClient, szRepMessage, iMessageLen, 0) failed with:\n%d\n", WSAGetLastError());
exit(1);
}
printf("OK\n");
printf("Closing client socket...");
closesocket(sClient);
printf("OK\n");
return 0;
}

Related entries: