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;
}