Skip to content

Instantly share code, notes, and snippets.

@brandonto
Last active October 31, 2015 21:07
Show Gist options
  • Save brandonto/92fcc31b233611325b4d to your computer and use it in GitHub Desktop.
Save brandonto/92fcc31b233611325b4d to your computer and use it in GitHub Desktop.
Windows Socket TCP
#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
typedef int socklen_t;
typedef int ssize_t;
int server();
int client();
int main()
{
return client();
}
int server()
{
int sockfd;
int connectionfd;
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_STREAM, 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;
std::cout << "Calling listen." << std::endl;
if (listen(sockfd, 10) == -1)
{
std::cerr << "Call to listen failed." << std::endl;
exit(5);
}
std::cout << "Returning from listen." << std::endl;
if (getsockname(sockfd, (struct sockaddr*)&serv_addr, &serv_addr_len) == -1)
{
std::cerr << "Call to getsockname failed." << std::endl;
exit(6);
}
std::cout << "Server listening on " << inet_ntoa(serv_addr.sin_addr) << ":" << (int)ntohs(serv_addr.sin_port) << std::endl;
std::cout << "Calling accept." << std::endl;
if ((connectionfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_addr_len)) == -1)
{
std::cerr << "Call to accept failed." << std::endl;
exit(7);
}
std::cout << "Returning from accept." << std::endl;
if (getsockname(sockfd, (struct sockaddr*)&cli_addr, &cli_addr_len) == -1)
{
std::cerr << "Call to getsockname failed." << std::endl;
exit(8);
}
std::cout << "Client connected on " << inet_ntoa(cli_addr.sin_addr) << ":" << (int)ntohs(cli_addr.sin_port) << std::endl;
int receivedPackets = 0;
while (receivedPackets < PACKETS_TO_RECEIVE)
{
memset(recvBuf, 0, sizeof(recvBuf));
if (recv(connectionfd, recvBuf, sizeof(recvBuf), 0) <= 0)
{
break;
}
std::cout << "Received: " << recvBuf << std::endl;
receivedPackets++;
}
std::cout << "Closing connections." << std::endl;
closesocket(sockfd);
closesocket(connectionfd);
WSACleanup();
return 0;
}
int client()
{
int sockfd;
struct sockaddr_in serv_addr;
socklen_t serv_addr_len = sizeof(serv_addr);
char sendBuf[256];
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr << "Call to WSAStartup failed." << std::endl;
exit(1);
}
std::cout << "Calling socket." << std::endl;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
std::cerr << "Call to socket failed." << std::endl;
exit(2);
}
std::cout << "Returning from socket." << std::endl;
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(3);
}
std::cout << "Calling connect." << std::endl;
if (connect(sockfd, (struct sockaddr*)&serv_addr, serv_addr_len) == -1)
{
std::cerr << "Call to accept failed." << std::endl;
exit(3);
}
std::cout << "Returning from connect." << std::endl;
std::cout << "Connected to " << inet_ntoa(serv_addr.sin_addr) << ":" << (int)ntohs(serv_addr.sin_port) << std::endl;
int sentPackets = 0;
while (sentPackets < PACKETS_TO_SEND)
{
memset(sendBuf, 0, sizeof(sendBuf));
strncpy_s(sendBuf, "Hello world!", 13);
if (send(sockfd, sendBuf, sizeof(sendBuf), 0) <= 0)
{
break;
}
std::cout << "Sent: " << sendBuf << std::endl;
sentPackets++;
}
std::cout << "Closing connections." << std::endl;
closesocket(sockfd);
WSACleanup();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment