Created
November 1, 2015 00:56
-
-
Save brandonto/03e989b2399ab8584670 to your computer and use it in GitHub Desktop.
Windows Socket UDP
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 | |
| #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