| 27 * |
27 * |
| 28 */ |
28 */ |
| 29 |
29 |
| 30 #include <stdlib.h> |
30 #include <stdlib.h> |
| 31 #include <string.h> |
31 #include <string.h> |
| |
32 #include <stdio.h> |
| |
33 #include <unistd.h> |
| |
34 #include <sys/un.h> |
| 32 #include "network.h" |
35 #include "network.h" |
| 33 |
36 |
| 34 #include <stdio.h> |
37 int net_create_tcp(Server *server, short port) { |
| 35 |
38 memset(server, 0, sizeof(Server)); |
| 36 #define new_socket() socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
39 server->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
| 37 |
|
| 38 int net_create(Server *server, short port) { |
|
| 39 server->info = NULL; |
|
| 40 |
|
| 41 struct sockaddr_in addr; |
|
| 42 addr.sin_family = AF_INET; |
|
| 43 addr.sin_addr.s_addr = INADDR_ANY; |
|
| 44 addr.sin_port = htons(port); |
|
| 45 |
|
| 46 server->fd = new_socket(); |
|
| 47 if (server->fd > -1) { |
40 if (server->fd > -1) { |
| 48 int one = 1; |
41 int one = 1; |
| 49 setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); |
42 setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); |
| |
43 |
| |
44 struct sockaddr_in addr; |
| |
45 addr.sin_family = AF_INET; |
| |
46 addr.sin_addr.s_addr = INADDR_ANY; |
| |
47 addr.sin_port = htons(port); |
| 50 if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) { |
48 if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) { |
| 51 server->fd = -1; |
49 server->fd = -1; |
| 52 return 1; |
50 return 1; |
| 53 } else { |
51 } else { |
| 54 return 0; |
52 return 0; |
| 56 } else { |
54 } else { |
| 57 return 1; |
55 return 1; |
| 58 } |
56 } |
| 59 } |
57 } |
| 60 |
58 |
| 61 static int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) { |
59 int net_find_tcp(Server *server, char *host, short port) { |
| |
60 memset(server, 0, sizeof(Server)); |
| |
61 server->fd = -1; |
| |
62 |
| 62 struct addrinfo hints = {0}; |
63 struct addrinfo hints = {0}; |
| 63 hints.ai_socktype = SOCK_STREAM; |
64 hints.ai_socktype = SOCK_STREAM; |
| 64 hints.ai_protocol = IPPROTO_TCP; |
65 hints.ai_protocol = IPPROTO_TCP; |
| 65 hints.ai_family = AF_INET; |
66 hints.ai_family = AF_INET; |
| 66 |
67 char portstr[6]; |
| 67 return getaddrinfo(host, port, &hints, info); |
68 sprintf(portstr, "%hd", port); |
| |
69 return getaddrinfo(host, portstr, &hints, &server->info); |
| 68 } |
70 } |
| 69 |
71 |
| 70 int net_find(Server *server, char *host, short port) { |
72 int net_create_sock(Server *server, char * path) { |
| |
73 memset(server, 0, sizeof(Server)); |
| |
74 server->fd = socket(AF_UNIX, SOCK_STREAM, 0); |
| |
75 if (server->fd > -1) { |
| |
76 struct sockaddr_un addr; |
| |
77 addr.sun_family = AF_UNIX; |
| |
78 addr.sun_family = AF_UNIX; |
| |
79 strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); |
| |
80 if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) { |
| |
81 server->fd = -1; |
| |
82 return 1; |
| |
83 } else { |
| |
84 return 0; |
| |
85 } |
| |
86 } else { |
| |
87 return 1; |
| |
88 } |
| |
89 } |
| |
90 |
| |
91 int net_find_sock(Server *server, char *path) { |
| 71 memset(server, 0, sizeof(Server)); |
92 memset(server, 0, sizeof(Server)); |
| 72 server->fd = -1; |
93 server->fd = -1; |
| 73 char portstr[6]; |
94 |
| 74 sprintf(portstr, "%hd", port); |
95 server->info = calloc(1, sizeof(struct addrinfo)); |
| 75 return getaddrinfo_intrnl(host, portstr, &(server->info)); |
96 server->info->ai_family = AF_UNIX; |
| |
97 server->info->ai_socktype = SOCK_STREAM; |
| |
98 server->info->ai_protocol = 0; |
| |
99 struct sockaddr_un *addr = malloc(sizeof(struct sockaddr_un)); |
| |
100 addr->sun_family = AF_UNIX; |
| |
101 strncpy(addr->sun_path, path, sizeof(addr->sun_path) - 1); |
| |
102 server->info->ai_addr = (struct sockaddr*) addr; |
| |
103 server->info->ai_addrlen = sizeof(struct sockaddr_un); |
| |
104 return 0; |
| 76 } |
105 } |
| 77 |
106 |
| 78 int net_listen(Server *server) { |
107 int net_listen(Server *server) { |
| 79 listen(server->fd, 1); |
108 listen(server->fd, 1); |
| 80 Client* client = malloc(sizeof(Client)); |
109 Client* client = malloc(sizeof(Client)); |
| 90 |
119 |
| 91 int net_connect(Server *server) { |
120 int net_connect(Server *server) { |
| 92 |
121 |
| 93 Client* client = calloc(1, sizeof(Client)); |
122 Client* client = calloc(1, sizeof(Client)); |
| 94 client->fd = -1; |
123 client->fd = -1; |
| 95 server->fd = new_socket(); |
124 server->fd = socket( |
| |
125 server->info->ai_family, |
| |
126 server->info->ai_socktype, |
| |
127 server->info->ai_protocol |
| |
128 ); |
| 96 server->client = client; |
129 server->client = client; |
| 97 |
130 |
| 98 if (server->fd == -1) { |
131 if (server->fd == -1) { |
| 99 return 1; |
132 return 1; |
| 100 } |
133 } |
| 101 |
134 |
| 102 return connect(server->fd, server->info->ai_addr, server->info->ai_addrlen); |
135 return connect(server->fd, server->info->ai_addr, server->info->ai_addrlen); |
| 103 } |
136 } |
| 104 |
137 |
| 105 int net_destroy(Server *server) { |
138 void net_destroy(Server *server) { |
| 106 if (server->info) { |
139 if (server->info) { |
| 107 freeaddrinfo(server->info); |
140 freeaddrinfo(server->info); |
| 108 } |
141 } |
| 109 if (server->client) { |
142 if (server->client) { |
| 110 shutdown(server->client->fd, SHUT_RDWR); |
143 shutdown(server->client->fd, SHUT_RDWR); |
| |
144 close(server->client->fd); |
| 111 free(server->client); |
145 free(server->client); |
| |
146 server->client = NULL; |
| 112 } |
147 } |
| 113 if (server->fd > -1) { |
148 if (server->fd > -1) { |
| 114 return shutdown(server->fd, SHUT_RDWR); |
149 shutdown(server->fd, SHUT_RDWR); |
| |
150 close(server->fd); |
| |
151 server->fd = -1; |
| 115 } |
152 } |
| 116 |
|
| 117 return 0; |
|
| 118 } |
153 } |
| 119 |
154 |
| 120 void net_send_code(int socket, uint8_t code) { |
155 void net_send_code(int socket, uint8_t code) { |
| 121 send(socket, &code, sizeof(uint8_t), 0); |
156 send(socket, &code, sizeof(uint8_t), 0); |
| 122 } |
157 } |