Changes in uspace/srv/net/app/nettest2/nettest2.c [3be62bc:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/app/nettest2/nettest2.c
r3be62bc raadf01e 48 48 #include "../../err.h" 49 49 50 #include "../nettest.h"51 50 #include "../parse.h" 52 51 #include "../print_error.h" … … 70 69 /** Prints the application help. 71 70 */ 72 void nettest2_print_help(void); 71 void print_help(void); 72 73 /** Translates the character string to the protocol family number. 74 * @param[in] name The protocol family name. 75 * @returns The corresponding protocol family number. 76 * @returns EPFNOSUPPORTED if the protocol family is not supported. 77 */ 78 int parse_protocol_family(const char * name); 79 80 /** Translates the character string to the socket type number. 81 * @param[in] name The socket type name. 82 * @returns The corresponding socket type number. 83 * @returns ESOCKNOSUPPORTED if the socket type is not supported. 84 */ 85 int parse_socket_type(const char * name); 73 86 74 87 /** Refreshes the data. … … 77 90 * @param[in] size The data block size in bytes. 78 91 */ 79 void nettest2_refresh_data(char * data, size_t size); 80 81 int main(int argc, char * argv[]){ 82 ERROR_DECLARE; 83 84 size_t size = 28; 85 int verbose = 0; 86 sock_type_t type = SOCK_DGRAM; 87 int sockets = 10; 88 int messages = 10; 89 int family = PF_INET; 90 uint16_t port = 7; 91 92 socklen_t max_length = sizeof(struct sockaddr_in6); 93 uint8_t address_data[max_length]; 94 struct sockaddr * address = (struct sockaddr *) address_data; 95 struct sockaddr_in * address_in = (struct sockaddr_in *) address; 96 struct sockaddr_in6 * address_in6 = (struct sockaddr_in6 *) address; 97 socklen_t addrlen; 98 // char address_string[INET6_ADDRSTRLEN]; 99 uint8_t * address_start; 100 101 int * socket_ids; 102 char * data; 103 int value; 104 int index; 105 struct timeval time_before; 106 struct timeval time_after; 107 108 printf("Task %d - ", task_get_id()); 109 printf("%s\n", NAME); 110 111 // parse the command line arguments 112 // stop before the last argument if it does not start with the minus sign ('-') 113 for(index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); ++ index){ 114 // options should start with the minus sign ('-') 115 if(argv[index][0] == '-'){ 116 switch(argv[index][1]){ 117 // short options with only one letter 118 case 'f': 119 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 0, parse_protocol_family)); 120 break; 121 case 'h': 122 nettest2_print_help(); 123 return EOK; 124 break; 125 case 'm': 126 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &messages, "message count", 0)); 127 break; 128 case 'n': 129 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &sockets, "socket count", 0)); 130 break; 131 case 'p': 132 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "port number", 0)); 133 port = (uint16_t) value; 134 break; 135 case 's': 136 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "packet size", 0)); 137 size = (value >= 0) ? (size_t) value : 0; 138 break; 139 case 't': 140 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 0, parse_socket_type)); 141 type = (sock_type_t) value; 142 break; 143 case 'v': 144 verbose = 1; 145 break; 146 // long options with the double minus sign ('-') 147 case '-': 148 if(str_lcmp(argv[index] + 2, "family=", 7) == 0){ 149 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 9, parse_protocol_family)); 150 }else if(str_lcmp(argv[index] + 2, "help", 5) == 0){ 151 nettest2_print_help(); 152 return EOK; 153 }else if(str_lcmp(argv[index] + 2, "messages=", 6) == 0){ 154 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &messages, "message count", 8)); 155 }else if(str_lcmp(argv[index] + 2, "sockets=", 6) == 0){ 156 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &sockets, "socket count", 8)); 157 }else if(str_lcmp(argv[index] + 2, "port=", 5) == 0){ 158 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "port number", 7)); 159 port = (uint16_t) value; 160 }else if(str_lcmp(argv[index] + 2, "type=", 5) == 0){ 161 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 7, parse_socket_type)); 162 type = (sock_type_t) value; 163 }else if(str_lcmp(argv[index] + 2, "verbose", 8) == 0){ 164 verbose = 1; 165 }else{ 166 print_unrecognized(index, argv[index] + 2); 167 nettest2_print_help(); 168 return EINVAL; 169 } 170 break; 171 default: 172 print_unrecognized(index, argv[index] + 1); 173 nettest2_print_help(); 174 return EINVAL; 175 } 176 }else{ 177 print_unrecognized(index, argv[index]); 178 nettest2_print_help(); 179 return EINVAL; 180 } 181 } 182 183 // if not before the last argument containing the address 184 if(index >= argc){ 185 printf("Command line error: missing address\n"); 186 nettest2_print_help(); 187 return EINVAL; 188 } 189 190 // prepare the address buffer 191 bzero(address_data, max_length); 192 switch(family){ 193 case PF_INET: 194 address_in->sin_family = AF_INET; 195 address_in->sin_port = htons(port); 196 address_start = (uint8_t *) &address_in->sin_addr.s_addr; 197 addrlen = sizeof(struct sockaddr_in); 198 break; 199 case PF_INET6: 200 address_in6->sin6_family = AF_INET6; 201 address_in6->sin6_port = htons(port); 202 address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr; 203 addrlen = sizeof(struct sockaddr_in6); 204 break; 205 default: 206 fprintf(stderr, "Address family is not supported\n"); 207 return EAFNOSUPPORT; 208 } 209 210 // parse the last argument which should contain the address 211 if(ERROR_OCCURRED(inet_pton(family, argv[argc - 1], address_start))){ 212 fprintf(stderr, "Address parse error %d\n", ERROR_CODE); 213 return ERROR_CODE; 214 } 215 216 // check the buffer size 217 if(size <= 0){ 218 fprintf(stderr, "Data buffer size too small (%d). Using 1024 bytes instead.\n", size); 219 size = 1024; 220 } 221 222 // prepare the buffer 223 // size plus terminating null (\0) 224 data = (char *) malloc(size + 1); 225 if(! data){ 226 fprintf(stderr, "Failed to allocate data buffer.\n"); 227 return ENOMEM; 228 } 229 nettest2_refresh_data(data, size); 230 231 // check the socket count 232 if(sockets <= 0){ 233 fprintf(stderr, "Socket count too small (%d). Using 2 instead.\n", sockets); 234 sockets = 2; 235 } 236 237 // prepare the socket buffer 238 // count plus the terminating null (\0) 239 socket_ids = (int *) malloc(sizeof(int) * (sockets + 1)); 240 if(! socket_ids){ 241 fprintf(stderr, "Failed to allocate receive buffer.\n"); 242 return ENOMEM; 243 } 244 socket_ids[sockets] = NULL; 245 246 if(verbose){ 247 printf("Starting tests\n"); 248 } 249 250 ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type)); 251 252 if(type == SOCK_STREAM){ 253 ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen)); 254 } 255 256 if(verbose){ 257 printf("\n"); 258 } 259 260 if(ERROR_OCCURRED(gettimeofday(&time_before, NULL))){ 261 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 262 return ERROR_CODE; 263 } 264 265 ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages)); 266 267 if(ERROR_OCCURRED(gettimeofday(&time_after, NULL))){ 268 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 269 return ERROR_CODE; 270 } 271 272 if(verbose){ 273 printf("\tOK\n"); 274 } 275 276 printf("sendto + recvfrom tested in %d microseconds\n", tv_sub(&time_after, &time_before)); 277 278 if(ERROR_OCCURRED(gettimeofday(&time_before, NULL))){ 279 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 280 return ERROR_CODE; 281 } 282 283 ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, sockets, address, addrlen, data, size, messages)); 284 ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages)); 285 286 if(ERROR_OCCURRED(gettimeofday(&time_after, NULL))){ 287 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 288 return ERROR_CODE; 289 } 290 291 if(verbose){ 292 printf("\tOK\n"); 293 } 294 295 printf("sendto, recvfrom tested in %d microseconds\n", tv_sub(&time_after, &time_before)); 296 297 ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets)); 298 299 if(verbose){ 300 printf("\nExiting\n"); 301 } 302 303 return EOK; 304 } 305 306 void nettest2_print_help(void){ 92 void refresh_data(char * data, size_t size); 93 94 /** Creates new sockets. 95 * @param[in] verbose A value indicating whether to print out verbose information. 96 * @param[out] socket_ids A field to store the socket identifiers. 97 * @param[in] sockets The number of sockets to create. Should be at most the size of the field. 98 * @param[in] family The socket address family. 99 * @param[in] type The socket type. 100 * @returns EOK on success. 101 * @returns Other error codes as defined for the socket() function. 102 */ 103 int sockets_create(int verbose, int * socket_ids, int sockets, int family, sock_type_t type); 104 105 /** Closes sockets. 106 * @param[in] verbose A value indicating whether to print out verbose information. 107 * @param[in] socket_ids A field of stored socket identifiers. 108 * @param[in] sockets The number of sockets in the field. Should be at most the size of the field. 109 * @returns EOK on success. 110 * @returns Other error codes as defined for the closesocket() function. 111 */ 112 int sockets_close(int verbose, int * socket_ids, int sockets); 113 114 /** Connects sockets. 115 * @param[in] verbose A value indicating whether to print out verbose information. 116 * @param[in] socket_ids A field of stored socket identifiers. 117 * @param[in] sockets The number of sockets in the field. Should be at most the size of the field. 118 * @param[in] address The destination host address to connect to. 119 * @param[in] addrlen The length of the destination address in bytes. 120 * @returns EOK on success. 121 * @returns Other error codes as defined for the connect() function. 122 */ 123 int sockets_connect(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen); 124 125 /** Sends data via sockets. 126 * @param[in] verbose A value indicating whether to print out verbose information. 127 * @param[in] socket_ids A field of stored socket identifiers. 128 * @param[in] sockets The number of sockets in the field. Should be at most the size of the field. 129 * @param[in] address The destination host address to send data to. 130 * @param[in] addrlen The length of the destination address in bytes. 131 * @param[in] data The data to be sent. 132 * @param[in] size The data size in bytes. 133 * @param[in] messages The number of datagrams per socket to be sent. 134 * @returns EOK on success. 135 * @returns Other error codes as defined for the sendto() function. 136 */ 137 int sockets_sendto(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen, char * data, int size, int messages); 138 139 /** Receives data via sockets. 140 * @param[in] verbose A value indicating whether to print out verbose information. 141 * @param[in] socket_ids A field of stored socket identifiers. 142 * @param[in] sockets The number of sockets in the field. Should be at most the size of the field. 143 * @param[in] address The source host address of received datagrams. 144 * @param[in,out] addrlen The maximum length of the source address in bytes. The actual size of the source address is set instead. 145 * @param[out] data The received data. 146 * @param[in] size The maximum data size in bytes. 147 * @param[in] messages The number of datagrams per socket to be received. 148 * @returns EOK on success. 149 * @returns Other error codes as defined for the recvfrom() function. 150 */ 151 int sockets_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages); 152 153 /** Sends and receives data via sockets. 154 * Each datagram is sent and a reply read consequently. 155 * The next datagram is sent after the reply is received. 156 * @param[in] verbose A value indicating whether to print out verbose information. 157 * @param[in] socket_ids A field of stored socket identifiers. 158 * @param[in] sockets The number of sockets in the field. Should be at most the size of the field. 159 * @param[in,out] address The destination host address to send data to. The source host address of received datagrams is set instead. 160 * @param[in] addrlen The length of the destination address in bytes. 161 * @param[in,out] data The data to be sent. The received data are set instead. 162 * @param[in] size The data size in bytes. 163 * @param[in] messages The number of datagrams per socket to be received. 164 * @returns EOK on success. 165 * @returns Other error codes as defined for the recvfrom() function. 166 */ 167 int sockets_sendto_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages); 168 169 /** Prints a mark. 170 * If the index is a multiple of ten, a different mark is printed. 171 * @param[in] index The index of the mark to be printed. 172 */ 173 void print_mark(int index); 174 175 void print_help(void){ 307 176 printf( 308 177 "Network Networking test 2 aplication - UDP transfer\n" \ … … 332 201 } 333 202 334 void nettest2_refresh_data(char * data, size_t size){ 203 int parse_protocol_family(const char * name){ 204 if(str_lcmp(name, "PF_INET", 7) == 0){ 205 return PF_INET; 206 }else if(str_lcmp(name, "PF_INET6", 8) == 0){ 207 return PF_INET6; 208 } 209 return EPFNOSUPPORT; 210 } 211 212 int parse_socket_type(const char * name){ 213 if(str_lcmp(name, "SOCK_DGRAM", 11) == 0){ 214 return SOCK_DGRAM; 215 }else if(str_lcmp(name, "SOCK_STREAM", 12) == 0){ 216 return SOCK_STREAM; 217 } 218 return ESOCKTNOSUPPORT; 219 } 220 221 void refresh_data(char * data, size_t size){ 335 222 size_t length; 336 223 … … 345 232 } 346 233 234 int sockets_create(int verbose, int * socket_ids, int sockets, int family, sock_type_t type){ 235 int index; 236 237 if(verbose){ 238 printf("Create\t"); 239 } 240 fflush(stdout); 241 for(index = 0; index < sockets; ++ index){ 242 socket_ids[index] = socket(family, type, 0); 243 if(socket_ids[index] < 0){ 244 printf("Socket %d (%d) error:\n", index, socket_ids[index]); 245 socket_print_error(stderr, socket_ids[index], "Socket create: ", "\n"); 246 return socket_ids[index]; 247 } 248 if(verbose){ 249 print_mark(index); 250 } 251 } 252 return EOK; 253 } 254 255 int sockets_close(int verbose, int * socket_ids, int sockets){ 256 ERROR_DECLARE; 257 258 int index; 259 260 if(verbose){ 261 printf("\tClose\t"); 262 } 263 fflush(stdout); 264 for(index = 0; index < sockets; ++ index){ 265 if(ERROR_OCCURRED(closesocket(socket_ids[index]))){ 266 printf("Socket %d (%d) error:\n", index, socket_ids[index]); 267 socket_print_error(stderr, ERROR_CODE, "Socket close: ", "\n"); 268 return ERROR_CODE; 269 } 270 if(verbose){ 271 print_mark(index); 272 } 273 } 274 return EOK; 275 } 276 277 int sockets_connect(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen){ 278 ERROR_DECLARE; 279 280 int index; 281 282 if(verbose){ 283 printf("\tConnect\t"); 284 } 285 fflush(stdout); 286 for(index = 0; index < sockets; ++ index){ 287 if(ERROR_OCCURRED(connect(socket_ids[index], address, addrlen))){ 288 socket_print_error(stderr, ERROR_CODE, "Socket connect: ", "\n"); 289 return ERROR_CODE; 290 } 291 if(verbose){ 292 print_mark(index); 293 } 294 } 295 return EOK; 296 } 297 298 int sockets_sendto(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen, char * data, int size, int messages){ 299 ERROR_DECLARE; 300 301 int index; 302 int message; 303 304 if(verbose){ 305 printf("\tSendto\t"); 306 } 307 fflush(stdout); 308 for(index = 0; index < sockets; ++ index){ 309 for(message = 0; message < messages; ++ message){ 310 if(ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, addrlen))){ 311 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message); 312 socket_print_error(stderr, ERROR_CODE, "Socket send: ", "\n"); 313 return ERROR_CODE; 314 } 315 } 316 if(verbose){ 317 print_mark(index); 318 } 319 } 320 return EOK; 321 } 322 323 int sockets_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages){ 324 int value; 325 int index; 326 int message; 327 328 if(verbose){ 329 printf("\tRecvfrom\t"); 330 } 331 fflush(stdout); 332 for(index = 0; index < sockets; ++ index){ 333 for(message = 0; message < messages; ++ message){ 334 value = recvfrom(socket_ids[index], data, size, 0, address, addrlen); 335 if(value < 0){ 336 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message); 337 socket_print_error(stderr, value, "Socket receive: ", "\n"); 338 return value; 339 } 340 } 341 if(verbose){ 342 print_mark(index); 343 } 344 } 345 return EOK; 346 } 347 348 int sockets_sendto_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages){ 349 ERROR_DECLARE; 350 351 int value; 352 int index; 353 int message; 354 355 if(verbose){ 356 printf("\tSendto and recvfrom\t"); 357 } 358 fflush(stdout); 359 for(index = 0; index < sockets; ++ index){ 360 for(message = 0; message < messages; ++ message){ 361 if(ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, * addrlen))){ 362 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message); 363 socket_print_error(stderr, ERROR_CODE, "Socket send: ", "\n"); 364 return ERROR_CODE; 365 } 366 value = recvfrom(socket_ids[index], data, size, 0, address, addrlen); 367 if(value < 0){ 368 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message); 369 socket_print_error(stderr, value, "Socket receive: ", "\n"); 370 return value; 371 } 372 } 373 if(verbose){ 374 print_mark(index); 375 } 376 } 377 return EOK; 378 } 379 380 void print_mark(int index){ 381 if((index + 1) % 10){ 382 printf("*"); 383 }else{ 384 printf("|"); 385 } 386 fflush(stdout); 387 } 388 389 int main(int argc, char * argv[]){ 390 ERROR_DECLARE; 391 392 size_t size = 28; 393 int verbose = 0; 394 sock_type_t type = SOCK_DGRAM; 395 int sockets = 10; 396 int messages = 10; 397 int family = PF_INET; 398 uint16_t port = 7; 399 400 socklen_t max_length = sizeof(struct sockaddr_in6); 401 uint8_t address_data[max_length]; 402 struct sockaddr * address = (struct sockaddr *) address_data; 403 struct sockaddr_in * address_in = (struct sockaddr_in *) address; 404 struct sockaddr_in6 * address_in6 = (struct sockaddr_in6 *) address; 405 socklen_t addrlen; 406 // char address_string[INET6_ADDRSTRLEN]; 407 uint8_t * address_start; 408 409 int * socket_ids; 410 char * data; 411 int value; 412 int index; 413 struct timeval time_before; 414 struct timeval time_after; 415 416 printf("Task %d - ", task_get_id()); 417 printf("%s\n", NAME); 418 419 if(argc <= 1){ 420 print_help(); 421 return EINVAL; 422 } 423 424 for(index = 1; (index < argc - 1) || ((index == argc) && (argv[index][0] == '-')); ++ index){ 425 if(argv[index][0] == '-'){ 426 switch(argv[index][1]){ 427 case 'f': 428 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 0, parse_protocol_family)); 429 break; 430 case 'h': 431 print_help(); 432 return EOK; 433 break; 434 case 'm': 435 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &messages, "message count", 0)); 436 break; 437 case 'n': 438 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &sockets, "socket count", 0)); 439 break; 440 case 'p': 441 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "port number", 0)); 442 port = (uint16_t) value; 443 break; 444 case 's': 445 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "packet size", 0)); 446 size = (value >= 0) ? (size_t) value : 0; 447 break; 448 case 't': 449 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 0, parse_socket_type)); 450 type = (sock_type_t) value; 451 break; 452 case 'v': 453 verbose = 1; 454 break; 455 case '-': 456 if(str_lcmp(argv[index] + 2, "family=", 7) == 0){ 457 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 9, parse_protocol_family)); 458 }else if(str_lcmp(argv[index] + 2, "help", 5) == 0){ 459 print_help(); 460 return EOK; 461 }else if(str_lcmp(argv[index] + 2, "messages=", 6) == 0){ 462 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &messages, "message count", 8)); 463 }else if(str_lcmp(argv[index] + 2, "sockets=", 6) == 0){ 464 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &sockets, "socket count", 8)); 465 }else if(str_lcmp(argv[index] + 2, "port=", 5) == 0){ 466 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "port number", 7)); 467 port = (uint16_t) value; 468 }else if(str_lcmp(argv[index] + 2, "type=", 5) == 0){ 469 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 7, parse_socket_type)); 470 type = (sock_type_t) value; 471 }else if(str_lcmp(argv[index] + 2, "verbose", 8) == 0){ 472 verbose = 1; 473 }else{ 474 print_unrecognized(index, argv[index] + 2); 475 print_help(); 476 return EINVAL; 477 } 478 break; 479 default: 480 print_unrecognized(index, argv[index] + 1); 481 print_help(); 482 return EINVAL; 483 } 484 }else{ 485 print_unrecognized(index, argv[index]); 486 print_help(); 487 return EINVAL; 488 } 489 } 490 491 bzero(address_data, max_length); 492 switch(family){ 493 case PF_INET: 494 address_in->sin_family = AF_INET; 495 address_in->sin_port = htons(port); 496 address_start = (uint8_t *) &address_in->sin_addr.s_addr; 497 addrlen = sizeof(struct sockaddr_in); 498 break; 499 case PF_INET6: 500 address_in6->sin6_family = AF_INET6; 501 address_in6->sin6_port = htons(port); 502 address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr; 503 addrlen = sizeof(struct sockaddr_in6); 504 break; 505 default: 506 fprintf(stderr, "Address family is not supported\n"); 507 return EAFNOSUPPORT; 508 } 509 510 if(ERROR_OCCURRED(inet_pton(family, argv[argc - 1], address_start))){ 511 fprintf(stderr, "Address parse error %d\n", ERROR_CODE); 512 return ERROR_CODE; 513 } 514 515 if(size <= 0){ 516 fprintf(stderr, "Data buffer size too small (%d). Using 1024 bytes instead.\n", size); 517 size = 1024; 518 } 519 // size plus terminating null (\0) 520 data = (char *) malloc(size + 1); 521 if(! data){ 522 fprintf(stderr, "Failed to allocate data buffer.\n"); 523 return ENOMEM; 524 } 525 refresh_data(data, size); 526 527 if(sockets <= 0){ 528 fprintf(stderr, "Socket count too small (%d). Using 2 instead.\n", sockets); 529 sockets = 2; 530 } 531 // count plus terminating null (\0) 532 socket_ids = (int *) malloc(sizeof(int) * (sockets + 1)); 533 if(! socket_ids){ 534 fprintf(stderr, "Failed to allocate receive buffer.\n"); 535 return ENOMEM; 536 } 537 socket_ids[sockets] = NULL; 538 539 if(verbose){ 540 printf("Starting tests\n"); 541 } 542 543 ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type)); 544 545 if(type == SOCK_STREAM){ 546 ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen)); 547 } 548 549 if(verbose){ 550 printf("\n"); 551 } 552 553 if(ERROR_OCCURRED(gettimeofday(&time_before, NULL))){ 554 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 555 return ERROR_CODE; 556 } 557 558 ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages)); 559 560 if(ERROR_OCCURRED(gettimeofday(&time_after, NULL))){ 561 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 562 return ERROR_CODE; 563 } 564 565 if(verbose){ 566 printf("\tOK\n"); 567 } 568 569 printf("sendto + recvfrom tested in %d microseconds\n", tv_sub(&time_after, &time_before)); 570 571 if(ERROR_OCCURRED(gettimeofday(&time_before, NULL))){ 572 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 573 return ERROR_CODE; 574 } 575 576 ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, sockets, address, addrlen, data, size, messages)); 577 ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages)); 578 579 if(ERROR_OCCURRED(gettimeofday(&time_after, NULL))){ 580 fprintf(stderr, "Get time of day error %d\n", ERROR_CODE); 581 return ERROR_CODE; 582 } 583 584 if(verbose){ 585 printf("\tOK\n"); 586 } 587 588 printf("sendto, recvfrom tested in %d microseconds\n", tv_sub(&time_after, &time_before)); 589 590 ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets)); 591 592 if(verbose){ 593 printf("\nExiting\n"); 594 } 595 596 return EOK; 597 } 598 347 599 /** @} 348 600 */
Note:
See TracChangeset
for help on using the changeset viewer.