compiles
[ebb.git] / ev_tcp_socket.c
blob170af488fc50bfb5a8fb7501aeb9bd9605209baf
1 #include "tcp_socket.h"
2 #include <unistd.h>
3 #include <fcntl.h>
4 #include <sys/types.h>
5 #include <arpa/inet.h>
6 #include <assert.h>
8 /* private functions */
9 tcp_socket* tcp_socket_accept(tcp_socket *socket);
11 tcp_socket* tcp_socket_new(tcp_socket_error_cb error_cb)
13 tcp_socket *s = g_new0(tcp_socket, 1);
15 s->fd = socket(PF_INET, SOCK_STREAM, 0);
16 s->error_cb = error_cb;
17 fcntl(s->fd, F_SETFL, O_NONBLOCK);
18 // set SO_REUSEADDR?
19 return s;
22 void tcp_socket_free(tcp_socket *socket)
24 tcp_socket_close(socket);
25 free(socket);
28 void tcp_socket_close(tcp_socket *socket)
30 close(socket->fd);
33 char* tcp_socket_address(tcp_socket *socket)
35 unsigned int addrlen;
37 getpeername(socket->fd, (struct sockaddr*)&(socket->sockaddr), &addrlen);
38 return inet_ntoa(socket->sockaddr.sin_addr);
41 void tcp_socket_listen (tcp_socket *socket, char *address, int port, int backlog)
43 const int buf_size = 4096;
45 socket->sockaddr.sin_family = AF_INET;
46 socket->sockaddr.sin_port = htons(port);
47 inet_aton(address, &(socket->sockaddr.sin_addr));
49 setsockopt(socket->fd, SOL_SOCKET, SO_SNDBUF, &buf_size, sizeof(int));
51 bind(socket->fd, (struct sockaddr*)&(socket->sockaddr), sizeof(socket->sockaddr));
52 listen(socket->fd, backlog);
55 tcp_socket* tcp_socket_accept(tcp_socket *socket)
57 tcp_socket *client_socket = g_new0(tcp_socket, 1);
58 socklen_t len;
60 client_socket->error_cb = socket->error_cb;
61 client_socket->fd = accept(socket->fd, (struct sockaddr*)&(client_socket->sockaddr), &len);
62 // if(client_socket->fd < 0) { error }
63 fcntl(client_socket->fd, F_SETFL, O_NONBLOCK);
65 return client_socket;
68 /* Unit tests */
69 #include <stdio.h>
70 #include <stdlib.h>
71 int main(void)
73 tcp_socket *socket;
75 socket = tcp_socket_new(0);
76 tcp_socket_free(socket);
78 socket = tcp_socket_new(0);
79 tcp_socket_listen(socket, "0.0.0.0", 3001, 1024);
80 system("telnet localhost 3001");
82 tcp_socket_free(socket);
85 printf("hello world\n");
86 return 0; // success