src/network.c

changeset 94
864f59271974
parent 93
9b64437262a2
child 95
2624e7ebb525
equal deleted inserted replaced
93:9b64437262a2 94:864f59271974
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 }

mercurial