2 * inet (BSD) socket sender application
3 * starts a client socket that connects to server and sends data
5 * 2010, Razvan Deaconescu
12 #include <sys/types.h>
13 #include <sys/socket.h>
17 #include "sock_util.h"
21 #define DEFAULT_BUFFER_SIZE 1024
22 #define DEFAULT_PACKET_DELAY 1000
24 #define PACKET_INDEX_SIZE sizeof(unsigned long long)
25 #define PACKET_TIMESPEC_SIZE sizeof(time_t)
26 #define PACKET_PAYLOAD_SIZE (PACKET_SIZE - PACKET_INDEX_SIZE - PACKET_TIMESPEC_SIZE)
27 #define PACKET_SIZE (cmd_args.buffer_size)
32 size_t packet_delay; /* milliseconds */
33 char server_host[128];
34 unsigned short int server_port;
36 .buffer_size = DEFAULT_BUFFER_SIZE,
37 .packet_delay = DEFAULT_PACKET_DELAY,
43 /* connection socket */
46 static void init_buffer_random(char *buf, size_t len)
52 for (i = 0; i < len-2; i++)
53 buf[i] = (char) (rand() % 26) + 'a';
57 static void init_buffers(void)
59 init_buffer_random(rcv_buf, PACKET_SIZE);
60 init_buffer_random(snd_buf, PACKET_PAYLOAD_SIZE);
63 static void init(void)
65 rcv_buf = malloc(PACKET_SIZE * sizeof(char));
66 snd_buf = malloc(PACKET_SIZE * sizeof(char));
67 DIE(snd_buf == NULL, "malloc");
72 static void cleanup(void)
78 static void fill_send_buffer(void)
80 static unsigned long long index = 0;
82 time_t curr_time_secs;
84 curr_time_secs = time(NULL);
86 ptr = snd_buf + PACKET_PAYLOAD_SIZE;
87 * (unsigned long long *) ptr = index;
88 ptr += PACKET_INDEX_SIZE;
89 * (time_t *) ptr = curr_time_secs;
91 printf("[send] index: %llu curr_time_secs: %lu\n", index, curr_time_secs);
95 static ssize_t send_buffer(int sockfd)
97 return send(sockfd, snd_buf, PACKET_SIZE, 0);
100 static ssize_t receive_buffer(int sockfd)
105 while (nbytes < (ssize_t) PACKET_SIZE) {
106 n = recv(sockfd, rcv_buf, PACKET_SIZE - nbytes, 0);
115 static void delay_packet(void)
120 ts.tv_sec = cmd_args.packet_delay / 1000;
121 ts.tv_nsec = (cmd_args.packet_delay % 1000) * 1000000;
123 rc = nanosleep(&ts, NULL);
124 DIE(rc < 0, "nanosleep");
127 static void usage(const char *argv0)
129 fprintf(stderr, "Usage: %s [-h | --help] [-b | --buffer-size <buffer-size>] [-d | --delay <packet-delay>] <server-host> <server-port>\n", argv0);
132 static void print_args(void)
134 printf("buffer_size: %lu\n", cmd_args.buffer_size);
135 printf("delay: %lu\n", cmd_args.packet_delay);
136 printf("server_host: %s\n", cmd_args.server_host);
137 printf("server_port: %hu\n", cmd_args.server_port);
140 static void parse_args(int argc, char **argv)
145 int option_index = 0;
146 static struct option long_options[] = {
147 {"buffer-size", 1, NULL, 'b'},
148 {"packet-delay", 1, NULL, 'd'},
149 {"help", 0, NULL, 'h'},
153 c = getopt_long(argc, argv, "hb:d:",
154 long_options, &option_index);
160 printf("option %s", long_options[option_index].name);
162 printf(" with arg %s", optarg);
167 /* TODO: use strtoul */
168 cmd_args.buffer_size = atoi(optarg);
172 /* TODO: use strtoul */
173 cmd_args.packet_delay = atoi(optarg);
185 printf("?? getopt returned character code 0%o ??\n", c);
189 if (optind + 2 != argc) {
194 /* TODO: check argv[argc-2] size */
195 strcpy(cmd_args.server_host, argv[argc-2]);
196 /* TODO: use strtoul */
197 cmd_args.server_port = atoi(argv[argc-1]);
202 int main(int argc, char **argv)
204 parse_args(argc, argv);
206 connectfd = tcp_connect_to_server(cmd_args.server_host,
207 cmd_args.server_port);
208 DIE(connectfd < 0, "tcp_connect_to_server");
216 nbytes = send_buffer(connectfd);
217 DIE(nbytes < 0, "send_buffer");