Skip to content

Instantly share code, notes, and snippets.

@haxelion
Created March 9, 2015 09:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save haxelion/4e91679d8e410ab422fe to your computer and use it in GitHub Desktop.
Save haxelion/4e91679d8e410ab422fe to your computer and use it in GitHub Desktop.
#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