Last active
October 31, 2015 21:07
-
-
Save brandonto/92fcc31b233611325b4d to your computer and use it in GitHub Desktop.
Windows Socket TCP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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