Created
October 5, 2015 14:02
-
-
Save zonque/7361965a20b3b4cecf19 to your computer and use it in GitHub Desktop.
Simple DCCP client/server test
This file contains hidden or 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
/* | |
* 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