-
-
Save 1lusca/9ef622d3db4fcd4c447f89fe5682f68e to your computer and use it in GitHub Desktop.
Revisions
-
zonque revised this gist
Oct 5, 2015 . 1 changed file with 24 additions and 26 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -24,12 +24,12 @@ #define MY_PORT_NUM 62324 static void die(const char *s) { perror(s); exit(1); } static void server(void) { int listen_fd, conn_fd, flags, ret, in; struct sctp_sndrcvinfo sndrcvinfo; struct sockaddr_in servaddr = { .sin_family = AF_INET, @@ -42,19 +42,19 @@ static int server(void) { .sinit_max_attempts = 4, }; listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (listen_fd < 0) die("socket"); ret = bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (ret < 0) die("bind"); ret = setsockopt(listen_fd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg)); if (ret < 0) die("setsockopt"); ret = listen(listen_fd, initmsg.sinit_max_instreams); if (ret < 0) die("listen"); @@ -64,55 +64,53 @@ static int server(void) { printf("Waiting for connection\n"); fflush(stdout); conn_fd = accept(listen_fd, (struct sockaddr *) NULL, NULL); if(conn_fd < 0) die("accept()"); printf("New client connected\n"); fflush(stdout); in = sctp_recvmsg(conn_fd, buffer, sizeof(buffer), NULL, 0, &sndrcvinfo, &flags); if (in > 0) { printf("Received data: %s\n", buffer); fflush(stdout); } close(conn_fd); } } static void client(void) { int conn_fd, ret; const char *msg = "Hello, Server!"; struct sockaddr_in servaddr = { .sin_family = AF_INET, .sin_port = htons(MY_PORT_NUM), .sin_addr.s_addr = inet_addr("127.0.0.1"), }; conn_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (conn_fd < 0) die("socket()"); ret = connect(conn_fd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (ret < 0) die("connect()"); ret = sctp_sendmsg(conn_fd, (void *) msg, strlen(msg) + 1, NULL, 0, 0, 0, 0, 0, 0 ); if (ret < 0) die("sctp_sendmsg"); close(conn_fd); } int main(int argc, char **argv) { if (strstr(basename(argv[0]), "server")) server(); else client(); return 0; } -
zonque revised this gist
Oct 5, 2015 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -100,7 +100,7 @@ static int client(void) { if (ret < 0) die("connect()"); ret = sctp_sendmsg(conn_sock, (void *) msg, strlen(msg) + 1, NULL, 0, 0, 0, 0, 0, 0 ); if (ret < 0) die("sctp_sendmsg"); -
zonque created this gist
Oct 5, 2015 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,118 @@ /* * Compile: * * gcc sctptest.c -o server -lsctp -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 <netinet/sctp.h> #include <arpa/inet.h> #define MY_PORT_NUM 62324 static void die(const char *s) { perror(s); exit(1); } static int server(void) { int listen_sock, conn_sock, flags, ret, in; struct sctp_sndrcvinfo sndrcvinfo; struct sockaddr_in servaddr = { .sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_ANY), .sin_port = htons(MY_PORT_NUM), }; struct sctp_initmsg initmsg = { .sinit_num_ostreams = 5, .sinit_max_instreams = 5, .sinit_max_attempts = 4, }; listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (listen_sock < 0) die("socket"); ret = bind(listen_sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (ret < 0) die("bind"); ret = setsockopt(listen_sock, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg)); if (ret < 0) die("setsockopt"); ret = listen(listen_sock, initmsg.sinit_max_instreams); if (ret < 0) die("listen"); for (;;) { char buffer[1024]; printf("Waiting for connection\n"); fflush(stdout); conn_sock = accept(listen_sock, (struct sockaddr *) NULL, NULL); if(conn_sock < 0) die("accept()"); printf("New client connected\n"); fflush(stdout); in = sctp_recvmsg(conn_sock, buffer, sizeof(buffer), NULL, 0, &sndrcvinfo, &flags); if (in > 0) { printf("Received data: %s\n", buffer); fflush(stdout); } close(conn_sock); } return 0; } static int client(void) { int conn_sock, ret; const char *msg = "Hello, Server!"; struct sockaddr_in servaddr = { .sin_family = AF_INET, .sin_port = htons(MY_PORT_NUM), .sin_addr.s_addr = inet_addr("127.0.0.1"), }; conn_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (conn_sock < 0) die("socket()"); ret = connect(conn_sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (ret < 0) die("connect()"); ret = sctp_sendmsg(conn_sock, (void *) msg, strlen(msg), NULL, 0, 0, 0, 0, 0, 0 ); if (ret < 0) die("sctp_sendmsg"); close(conn_sock); return 0; } int main(int argc, char **argv) { if (strstr(basename(argv[0]), "server")) return server(); return client(); }