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)
99 printf("before send\n");
100 n = send(sockfd, snd_buf, PACKET_SIZE, 0);
101 printf("after send\n");
105 printf ("n = %ld, send\n", n);
110 static ssize_t receive_buffer(int sockfd)
115 while (nbytes < (ssize_t) PACKET_SIZE) {
116 n = recv(sockfd, rcv_buf, PACKET_SIZE - nbytes, 0);
125 static void delay_packet(void)
130 ts.tv_sec = cmd_args.packet_delay / 1000;
131 ts.tv_nsec = (cmd_args.packet_delay % 1000) * 1000000;
133 rc = nanosleep(&ts, NULL);
134 DIE(rc < 0, "nanosleep");
137 static void usage(const char *argv0)
139 fprintf(stderr, "Usage: %s [-h | --help] [-b | --buffer-size <buffer-size>] [-d | --delay <packet-delay>] <server-host> <server-port>\n", argv0);
142 static void print_args(void)
144 printf("buffer_size: %lu\n", cmd_args.buffer_size);
145 printf("delay: %lu\n", cmd_args.packet_delay);
146 printf("server_host: %s\n", cmd_args.server_host);
147 printf("server_port: %hu\n", cmd_args.server_port);
150 static void parse_args(int argc, char **argv)
155 int option_index = 0;
156 static struct option long_options[] = {
157 {"buffer-size", 1, NULL, 'b'},
158 {"packet-delay", 1, NULL, 'd'},
159 {"help", 0, NULL, 'h'},
163 c = getopt_long(argc, argv, "hb:d:",
164 long_options, &option_index);
170 printf("option %s", long_options[option_index].name);
172 printf(" with arg %s", optarg);
177 /* TODO: use strtoul */
178 cmd_args.buffer_size = atoi(optarg);
182 /* TODO: use strtoul */
183 cmd_args.packet_delay = atoi(optarg);
195 printf("?? getopt returned character code 0%o ??\n", c);
199 if (optind + 2 != argc) {
204 /* TODO: check argv[argc-2] size */
205 strcpy(cmd_args.server_host, argv[argc-2]);
206 /* TODO: use strtoul */
207 cmd_args.server_port = atoi(argv[argc-1]);
212 int main(int argc, char **argv)
214 parse_args(argc, argv);
221 printf("ready to connect\n");
223 connectfd = tcp_connect_to_server(cmd_args.server_host,
224 cmd_args.server_port);
226 perror("tcp_connect_to_server");
230 printf("connected\n");
236 nbytes = send_buffer(connectfd);
237 printf("nbytes: %lu\n", nbytes);
238 DIE(nbytes < 0, "send_buffer");
240 printf("Connection closed\n");