SCTP socket added
This commit is contained in:
parent
02ae085aed
commit
018e1911c4
@ -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
|
||||
|
BIN
bin/sctp_sock
Executable file
BIN
bin/sctp_sock
Executable file
Binary file not shown.
BIN
bin/tcp_sock
BIN
bin/tcp_sock
Binary file not shown.
102
src/ksctp_socket.c
Normal file
102
src/ksctp_socket.c
Normal file
@ -0,0 +1,102 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/sctp.h>
|
||||
#include <netinet/in.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/event.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user