Skip to content

Instantly share code, notes, and snippets.

@brandonto
Created November 1, 2015 00:56
Show Gist options
  • Save brandonto/03e989b2399ab8584670 to your computer and use it in GitHub Desktop.
Save brandonto/03e989b2399ab8584670 to your computer and use it in GitHub Desktop.
Windows Socket UDP
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <winsock2.h>
#include <Windows.h>
#include <stdint.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "Ws2_32.lib")
#define PACKETS_TO_RECEIVE 5
#define PACKETS_TO_SEND 5
#define PORT 32000
#define MAX_BUF_SIZE 256
typedef int socklen_t;
typedef int ssize_t;
int server();
int client();
int send_message(int sockfd, char* buf, struct sockaddr* addr, socklen_t addr_len);
int recv_message(int sockfd, char* buf, struct sockaddr* addr, socklen_t* addr_len);
int main()
{
return client();
}
int server()
{
int sockfd;
struct sockaddr_in serv_addr;
socklen_t serv_addr_len = sizeof(serv_addr);
struct sockaddr_in cli_addr;
socklen_t cli_addr_len = sizeof(cli_addr);
char recvBuf[256];
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr << "Call to WSAStartup failed." << std::endl;
exit(1);
}
system("ipconfig");
std::cout << std::endl;
std::cout << "Calling socket." << std::endl;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
std::cerr << "Call to socket failed." << std::endl;
exit(2);
}
std::cout << "Returning from socket." << std::endl;
char yes = '1';
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {
std::cerr << "Call to setsockopt failed." << std::endl;
exit(3);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons((unsigned short)PORT);
std::cout << "Calling bind." << std::endl;
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
{
std::cerr << "Call to bind failed." << std::endl;
exit(4);
}
std::cout << "Returning from bind." << std::endl;
if (getsockname(sockfd, (struct sockaddr*)&serv_addr, &serv_addr_len) == -1)
{
std::cerr << "Call to getsockname failed." << std::endl;
exit(5);
}
std::cout << "Server listening on " << inet_ntoa(serv_addr.sin_addr) << ":" << (int)ntohs(serv_addr.sin_port) << std::endl;
int receivedPackets = 0;
while (receivedPackets < PACKETS_TO_RECEIVE)
{
memset(recvBuf, 0, sizeof(recvBuf));
if (recv_message(sockfd, recvBuf, (struct sockaddr*)&cli_addr, &cli_addr_len) < 0)
{
break;
}
std::cout << "Received: \"" << recvBuf << "\" from client on " << inet_ntoa(cli_addr.sin_addr) << ":" << (int)ntohs(cli_addr.sin_port) << std::endl;
receivedPackets++;
}
std::cout << "Closing socket." << std::endl;
closesocket(sockfd);
WSACleanup();
return 0;
}
int client()
{
int sockfd;
struct sockaddr_in serv_addr;
socklen_t serv_addr_len = sizeof(serv_addr);
char sendBuf[256];
std::cout << "Enter the target IP address: ";
char address_ascii[128];
std::cin >> address_ascii;
std::cout << "Enter the target port: ";
unsigned short port;
std::cin >> port;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
//serv_addr.sin_addr.s_addr = htonl(inet_addr(address_ascii));
serv_addr.sin_port = htons(port);
if (inet_pton(AF_INET, address_ascii, &(serv_addr.sin_addr)) == 0)
{
std::cerr << "Call to InetPton failed." << std::endl;
exit(1);
}
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr << "Call to WSAStartup failed." << std::endl;
exit(2);
}
std::cout << "Calling socket." << std::endl;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
std::cerr << "Call to socket failed." << std::endl;
exit(3);
}
std::cout << "Returning from socket." << std::endl;
int sentPackets = 0;
while (sentPackets < PACKETS_TO_SEND)
{
memset(sendBuf, 0, sizeof(sendBuf));
strncpy_s(sendBuf, "Hello world!", 13);
if (send_message(sockfd, sendBuf, (struct sockaddr*)&serv_addr, serv_addr_len) < 0)
{
exit(9);
break;
}
std::cout << "Sent: \"" << sendBuf << "\" to " << inet_ntoa(serv_addr.sin_addr) << ":" << (int)ntohs(serv_addr.sin_port) << std::endl;
sentPackets++;
}
std::cout << "Closing socket." << std::endl;
closesocket(sockfd);
WSACleanup();
return 0;
}
int send_message(int sockfd, char* buf, struct sockaddr* addr, socklen_t addr_len)
{
ssize_t bytes_sent;
bytes_sent = sendto(sockfd, buf, strlen(buf)+1, 0, addr, addr_len);
return bytes_sent==-1?-1:0;
}
int recv_message(int sockfd, char* buf, struct sockaddr* addr, socklen_t* addr_len)
{
ssize_t bytes_read;
bytes_read = recvfrom(sockfd, buf, MAX_BUF_SIZE, 0, addr, addr_len);
return bytes_read==-1?-1:0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment