Created
March 9, 2015 09:20
-
-
Save haxelion/4e91679d8e410ab422fe to your computer and use it in GitHub Desktop.
This file contains 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
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
void server(int sock) | |
{ | |
char buffer[256]; | |
int cur_seq = 0; | |
int cur_count = 0; | |
ssize_t size; | |
while(1) | |
{ | |
int seq, n; | |
size = recv(sock, buffer, 256, 0); | |
if(size == sizeof(int)*2) | |
{ | |
seq = ((int*)buffer)[0]; | |
n = ((int*)buffer)[1]; | |
if(seq == cur_seq) | |
cur_count++; | |
else | |
{ | |
printf("Received %d packets for seq %d\n", cur_count, cur_seq); | |
cur_seq = seq; | |
cur_count = 1; | |
} | |
} | |
else | |
printf("Discarded a packet"); | |
} | |
} | |
void client(int sock) | |
{ | |
char buffer[256]; | |
unsigned int seq, n; | |
for(seq = 0;; seq++) | |
{ | |
for(n = 0;n < 1024; n++) | |
{ | |
((int*)buffer)[0] = seq; | |
((int*)buffer)[1] = n; | |
send(sock, buffer, 2*sizeof(int), 0); | |
} | |
sleep(1); | |
} | |
} | |
int main(int argc, char *argv[]) | |
{ | |
int sock, port; | |
if(argc < 3) | |
{ | |
printf("Not enough arguments.\n"); | |
return; | |
} | |
sock = socket(AF_INET, SOCK_DGRAM, 0); | |
if(strcmp(argv[1], "-s") == 0) | |
{ | |
struct sockaddr_in sockaddr; | |
memset((void*)&sockaddr, 0, sizeof(sockaddr)); | |
port = atoi(argv[2]); | |
sockaddr.sin_family = AF_INET; | |
sockaddr.sin_addr.s_addr = INADDR_ANY; | |
sockaddr.sin_port = htons(port); | |
if(bind(sock, (struct sockaddr*) &sockaddr, sizeof(sockaddr)) != 0) | |
printf("Could not bind to port %d\n", port); | |
else | |
server(sock); | |
} | |
else if(strcmp(argv[1], "-c") == 0) | |
{ | |
struct addrinfo hints, *result; | |
hints.ai_family = AF_INET; | |
hints.ai_socktype = SOCK_DGRAM; | |
hints.ai_flags = AI_ALL; | |
hints.ai_protocol = 0; | |
hints.ai_canonname = NULL; | |
hints.ai_addr = NULL; | |
hints.ai_next = NULL; | |
if(getaddrinfo(argv[2], argv[3], &hints, &result) != 0) | |
printf("Could not resolve %s\n", argv[2]); | |
else | |
{ | |
if(connect(sock, result->ai_addr, result->ai_addrlen) != 0) | |
printf("Could not connect on %s:%s\n", argv[2], argv[3]); | |
else | |
client(sock); | |
freeaddrinfo(result); | |
} | |
} | |
else | |
printf("Not a valid mode, try -s or -c"); | |
close(sock); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment