diff --git a/README.md b/README.md index b63a16a..4994e37 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,13 @@ The `kqueue_socket.c` is my attempt on create a socket watcher timer program usi - Array of kevent +### SCTP + +- Listening +- Init ACK + +> Find out how to make a stateless connection over SCTP. + ## Goal - Understand the difference between c++ and C diff --git a/bin/sctp_sock b/bin/sctp_sock new file mode 100755 index 0000000..d1eb34e Binary files /dev/null and b/bin/sctp_sock differ diff --git a/bin/tcp_sock b/bin/tcp_sock index cd692d8..fa42a75 100755 Binary files a/bin/tcp_sock and b/bin/tcp_sock differ diff --git a/src/ksctp_socket.c b/src/ksctp_socket.c new file mode 100644 index 0000000..1564619 --- /dev/null +++ b/src/ksctp_socket.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include + + +int main() { + + int socket_listen_fd, + socket_connection_fd, + i, + kq, + client_len, + new_events, + port_num = 36215; + struct sockaddr_in serv_addr, client_addr; + struct kevent change_event, + evList[32], + event; + + socket_listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + if (((socket_listen_fd) < 0)) + { + perror("Faild creating socket"); + exit(1); + } + + bzero((char *)&serv_addr, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(port_num); + + if (bind(socket_listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + { + perror("Failed bind socket"); + exit(1); + } + + listen(socket_listen_fd, 3); + client_len = sizeof(client_addr); + + kq = kqueue(); + + EV_SET(&change_event, socket_listen_fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); + if (kevent(kq, &change_event, 1, NULL, 0, NULL) == -1) + { + perror("Failed to bind socket to kevent"); + exit(1); + } + + int x = 0; + + for (;;) { + + printf("-----------SEQ : %d\n", x+1); + + new_events = kevent(kq, NULL, 0, evList, 1, NULL); + + if (new_events == -1) + { + perror("Failed to create new kevent"); + exit(1); + } + + for (int i = 0; new_events > i; i++) + { + printf("Listed events : %d\n", new_events); + int event_fd = evList[i].ident; + + if (evList[i].flags & EV_EOF) + { + printf("Client disconnect...\n"); + close(event_fd); + } + + else if (event_fd == socket_listen_fd) ; + { + printf("New connection incoming...\n"); + + socket_connection_fd = accept(event_fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_len); + if (socket_connection_fd == -1) + { + perror("Failed to accept connection...\n"); + } + + EV_SET(&change_event, socket_connection_fd, EVFILT_READ, EV_ADD, 0, 0, NULL); + if (kevent(kq, &change_event, 1, NULL, 0, NULL) < 0) + { + perror("kevent failed to monitor socket connection"); + } + } + + } + + x=x+1; + } + + +} diff --git a/src/ktcp_socket_02.c b/src/ktcp_socket_02.c index cd36ef0..f5c11f6 100644 --- a/src/ktcp_socket_02.c +++ b/src/ktcp_socket_02.c @@ -14,12 +14,11 @@ int main() { kq, new_events; -struct kevent change_event, event; + struct kevent change_event, event; struct kevent evList[32]; - struct sockaddr_in serv_addr, client_addr; - if (((socket_listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)) + if (((socket_listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)) { perror("Failed creating socket"); exit(1); @@ -31,7 +30,7 @@ struct kevent change_event, event; serv_addr.sin_port = htons(port_num); if (bind(socket_listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) - { perror("Failed binding socket"); exit(1); + { perror("Failed binding socket"); exit(1); } listen(socket_listen_fd, 3);