Skip to content

Instantly share code, notes, and snippets.

@zonque
Created October 5, 2015 14:02
Show Gist options
  • Save zonque/7361965a20b3b4cecf19 to your computer and use it in GitHub Desktop.
Save zonque/7361965a20b3b4cecf19 to your computer and use it in GitHub Desktop.
Simple DCCP client/server test
/*
* Compile:
*
* gcc dccptest.c -o server -Wall
* ln -s server client
*
* Invoke:
*
* ./client
* ./server
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
#define SOL_DCCP 269
#define MAX_DCCP_CONNECTION_BACK_LOG 5
#define MY_PORT_NUM 62325
static void die(const char *s) {
perror(s);
exit(1);
}
static void server(void) {
int ret, listen_fd;
unsigned int one = 1;
struct sockaddr_in servaddr = {
.sin_family = AF_INET,
.sin_addr.s_addr = htonl(INADDR_ANY),
.sin_port = htons(MY_PORT_NUM),
};
listen_fd = socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
if (listen_fd < 0)
die("socket");
ret = setsockopt(listen_fd, SOL_DCCP, SO_REUSEADDR, (const char *) &one, sizeof(one));
if (ret < 0)
die("setsockopt(SO_REUSEADDR)");
ret = bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (ret < 0)
die("bind");
ret = listen(listen_fd, MAX_DCCP_CONNECTION_BACK_LOG);
if (ret < 0)
die("listen");
for (;;) {
char buffer[1024];
int conn_fd, in;
printf("Waiting for connection\n");
fflush(stdout);
conn_fd = accept(listen_fd, NULL, NULL);
if (conn_fd < 0)
die("accept()");
printf("New client connected\n");
fflush(stdout);
in = recv(conn_fd, buffer, sizeof(buffer), 0);
if (in > 0) {
printf("Received data: %s\n", buffer);
fflush(stdout);
}
close(conn_fd);
}
}
static void client(void) {
int ret, socket_fd;
unsigned int one = 1;
const char *msg = "Hello, Server!";
struct sockaddr_in servaddr = {
.sin_family = AF_INET,
.sin_port = htons(MY_PORT_NUM),
};
socket_fd = socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
if (socket_fd < 0)
die("socket");
ret = setsockopt(socket_fd, SOL_DCCP, SO_REUSEADDR, (const char *) &one, sizeof(one));
if (ret < 0)
die("setsockopt(SO_REUSEADDR)");
ret = connect(socket_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (ret < 0)
die("connect");
ret = send(socket_fd, msg, strlen(msg) + 1, 0);
if (ret < 0)
die("send");
}
int main(int argc, char **argv) {
if (strstr(basename(argv[0]), "server"))
server();
else
client();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment