29 |
29 |
30 #include <stdlib.h> |
30 #include <stdlib.h> |
31 #include <string.h> |
31 #include <string.h> |
32 #include "network.h" |
32 #include "network.h" |
33 |
33 |
34 int server_bind(Server *server) { |
34 #define new_socket() socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
35 server->fd = socket(server->info->ai_family, |
35 |
36 server->info->ai_socktype, server->info->ai_protocol); |
36 int net_create(Server *server, char* port) { |
|
37 server->info = NULL; |
|
38 |
|
39 struct sockaddr_in addr; |
|
40 addr.sin_family = AF_INET; |
|
41 addr.sin_addr.s_addr = INADDR_ANY; |
|
42 addr.sin_port = htons(atoi(port)); |
|
43 |
|
44 server->fd = new_socket(); |
37 if (server->fd > -1) { |
45 if (server->fd > -1) { |
38 int true = 1; |
46 int true = 1; |
39 setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int)); |
47 setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int)); |
40 if (bind(server->fd, |
48 if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) { |
41 server->info->ai_addr, server->info->ai_addrlen)) { |
|
42 server->fd = -1; |
49 server->fd = -1; |
43 return 1; |
50 return 1; |
44 } else { |
51 } else { |
45 return 0; |
52 return 0; |
46 } |
53 } |
47 } else { |
54 } else { |
48 return 1; |
55 return 1; |
49 } |
56 } |
50 } |
|
51 |
|
52 int net_create(Server *server, char* port) { |
|
53 return net_find(server, "localhost", port) || server_bind(server); |
|
54 } |
57 } |
55 |
58 |
56 int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) { |
59 int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) { |
57 struct addrinfo hints; |
60 struct addrinfo hints; |
58 memset(&hints, 0, sizeof(hints)); |
61 memset(&hints, 0, sizeof(hints)); |
80 |
83 |
81 return client->fd == -1; |
84 return client->fd == -1; |
82 } |
85 } |
83 |
86 |
84 int net_connect(Server *server) { |
87 int net_connect(Server *server) { |
85 struct addrinfo *info; |
88 |
86 if (getaddrinfo_intrnl("localhost", NULL, &info)) { |
89 Client* client = calloc(1, sizeof(Client)); |
|
90 client->fd = -1; |
|
91 server->fd = new_socket(); |
|
92 server->client = client; |
|
93 |
|
94 if (server->fd == -1) { |
87 return 1; |
95 return 1; |
88 } |
96 } |
89 |
97 |
90 Client* client = calloc(1, sizeof(Client)); |
98 return connect(server->fd, server->info->ai_addr, server->info->ai_addrlen); |
91 client->fd = socket(info->ai_family, info->ai_socktype, info->ai_protocol); |
|
92 server->client = client; |
|
93 |
|
94 freeaddrinfo(info); |
|
95 if (client->fd == -1) { |
|
96 return 1; |
|
97 } |
|
98 |
|
99 return connect(client->fd, server->info->ai_addr, server->info->ai_addrlen); |
|
100 } |
99 } |
101 |
100 |
102 int net_destroy(Server *server) { |
101 int net_destroy(Server *server) { |
103 if (server->info) { |
102 if (server->info) { |
104 freeaddrinfo(server->info); |
103 freeaddrinfo(server->info); |
111 return shutdown(server->fd, SHUT_RDWR); |
110 return shutdown(server->fd, SHUT_RDWR); |
112 } |
111 } |
113 |
112 |
114 return EXIT_SUCCESS; |
113 return EXIT_SUCCESS; |
115 } |
114 } |
|
115 |
|
116 void net_send(int socket, uint32_t code, void *data, size_t len) { |
|
117 code = htonl(code); |
|
118 send(socket, &code, sizeof(uint32_t), 0); |
|
119 send(socket, data, len, 0); |
|
120 } |
|
121 |
|
122 int net_recieve_code(int socket) { |
|
123 uint32_t code; |
|
124 recv(socket, &code, sizeof(uint32_t), 0); |
|
125 return ntohl(code); |
|
126 } |
|
127 |
|
128 void net_recieve_data(int socket, void *data, size_t len) { |
|
129 recv(socket, data, len, 0); |
|
130 } |