1 /* 2 * Copyright 2008-2010, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Yin Qiu 7 */ 8 9 10 #include <errno.h> 11 #include <netdb.h> 12 #include <netinet/in.h> 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <string.h> 16 #include <sys/socket.h> 17 #include <unistd.h> 18 19 20 #define MAX_LENGTH 4096 21 22 23 extern const char* __progname; 24 25 26 int 27 main(int argc, char** argv) 28 { 29 if (argc < 2) { 30 fprintf(stderr, "Usage: %s <host> [<port>]\n" 31 "Sends a UDP datagram to the specified target.\n" 32 "<port> defaults to 9999.\n", __progname); 33 return 1; 34 } 35 36 struct hostent* host = gethostbyname(argv[1]); 37 if (host == NULL) { 38 perror("gethostbyname"); 39 return 1; 40 } 41 42 uint16_t port = 9999; 43 if (argc > 2) 44 port = atol(argv[2]); 45 46 struct sockaddr_in serverAddr; 47 memset(&serverAddr, 0, sizeof(struct sockaddr_in)); 48 serverAddr.sin_family = AF_INET; 49 serverAddr.sin_port = htons(port); 50 serverAddr.sin_addr = *((struct in_addr*)host->h_addr); 51 52 int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 53 // We need to call connect() to receive async ICMP errors 54 if (connect(sockfd, (struct sockaddr*)&serverAddr, 55 sizeof(struct sockaddr_in)) < 0) { 56 fprintf(stderr, "Calling connect() on UDP socket failed: %s\n", 57 strerror(errno)); 58 return 1; 59 } 60 61 const char* string = "Hello"; 62 ssize_t bytes = write(sockfd, string, strlen(string)); 63 if (bytes < 0) { 64 fprintf(stderr, "UDP send failed: %s\n", strerror(errno)); 65 return 1; 66 } 67 68 printf("%zd bytes sent to remote server.\n", bytes); 69 70 char buffer[MAX_LENGTH]; 71 bytes = read(sockfd, buffer, MAX_LENGTH); 72 if (bytes > 0) { 73 printf("Received %zd bytes from remote host\n", bytes); 74 printf("%s\n", buffer); 75 } else { 76 // We are expecting this 77 printf("Error: %s\n", strerror(errno)); 78 } 79 close(sockfd); 80 printf("Socket closed.\n"); 81 82 return 0; 83 } 84