src/network.c

changeset 2
0a08f79c320d
parent 1
e5fbb8f9edbe
child 3
3693fd2eb0e9
equal deleted inserted replaced
1:e5fbb8f9edbe 2:0a08f79c320d
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 }

mercurial