00001
00002 #ifndef __JBXL_NETWORK_H_
00003 #define __JBXL_NETWORK_H_
00004
00005
00013 #include "tools.h"
00014 #include "jbxl_state.h"
00015
00016
00017 #define _WINSOCK_DEPRECATED_NO_WARNINGS
00018 #ifdef WIN32
00019
00020 #include <ws2tcpip.h>
00021 #include <fcntl.h>
00022
00023 #ifndef socklen_t
00024 #define socklen_t int
00025 #endif
00026 extern WSADATA WsaData;
00027
00028 #define _WINSOCK_DEPRECATED_NO_WARNINGS
00029 #pragma comment( lib, "ws2_32.lib" )
00030
00031 #else
00032
00033 #include <sys/socket.h>
00034
00035 #ifdef HAVE_UNISTD_H
00036 #ifndef _XOPEN_SOURCE
00037 #define _XOPEN_SOURCE
00038 #endif
00039 #include <unistd.h>
00040 #endif
00041
00042 #ifdef HAVE_SYS_SOCKIO_H
00043 #include <sys/sockio.h>
00044 #endif
00045
00046 #ifdef HAVE_NETINET_IN_H
00047 #include <netinet/in.h>
00048 #endif
00049 #ifdef HAVE_ARPA_INET_H
00050 #include <arpa/inet.h>
00051 #endif
00052
00053 #include <netdb.h>
00054
00055 #include <fcntl.h>
00056 #include <sys/ioctl.h>
00057 #include <net/if.h>
00058 #endif
00059
00060
00061
00062
00063
00064
00066
00067
00068 int init_network(void);
00069 void cleanup_network(void);
00070
00071
00073
00074
00075 int _udp_server_socket(int port, struct addrinfo** info, int family);
00076 int _udp_server_socket_setopt(int, int, const void*, int, struct addrinfo**, int f);
00077 int _udp_client_socket(char* host, int, struct addrinfo**, int family);
00078 int _udp_bind(int sock, int port, int family);
00079 int _udp_bind_setopt(int sock, int port, int opt, const void*, int len, int family);
00080
00081
00082
00083
00084
00085
00086 #define udp_server_socket(p, a) _udp_server_socket((p), (a), AF_UNSPEC)
00087 #define udp_server_socket_ipv4(p) _udp_server_socket((p), NULL, AF_INET)
00088 #define udp_server_socket_ipv6(p, a) _udp_server_socket((p), (a), AF_INET6)
00089
00090 #define udp_server_socket_setopt(p, o, v, l, a) _udp_server_socket_setopt((p), (o), (v), (l), (a), AF_UNSPEC)
00091 #define udp_server_socket_setopt_ipv4(p, o, v, l) _udp_server_socket_setopt((p), (o), (v), (l), NULL, AF_INET)
00092 #define udp_server_socket_setopt_ipv6(p, o, v, l, a) _udp_server_socket_setopt((p), (o), (v), (l), (a), AF_INET6)
00093
00094 #define udp_client_socket(h, p, a) _udp_client_socket((h), (p), (a), AF_UNSPEC)
00095 #define udp_client_socket_ipv4(h, p, a) _udp_client_socket((h), (p), (a), AF_INET)
00096 #define udp_client_socket_ipv6(h, p, a) _udp_client_socket((h), (p), (a), AF_INET6)
00097
00098 #define udp_bind(s, p) _udp_bind((s), (p), AF_UNSPEC)
00099 #define udp_bind_ipv4(s, p) _udp_bind((s), (p), AF_INET)
00100 #define udp_bind_ipv6(s, p) _udp_bind((s), (p), AF_INET6)
00101
00102 #define udp_bind_setopt(s, p, o, v, l) _udp_bind_setopt((s), (p), (o), (v), (l), AF_UNSPEC)
00103 #define udp_bind_setopt_ipv4(s, p, o, v, l) _udp_bind_setopt((s), (p), (o), (v), (l), AF_INET)
00104 #define udp_bind_setopt_ipv6(s, p, o, v, l) _udp_bind_setopt((s), (p), (o), (v), (l), AF_INET6)
00105
00106
00107 int _tcp_server_socket(int port, int family);
00108 int _tcp_server_socket_setopt(int port, int opt, const void*, int len, int famliy);
00109 int _tcp_server_bind(int port, int family);
00110 int _tcp_server_bind_setopt(int port, int opt, const void*, int len, int family);
00111
00112 #define tcp_server_socket(p) _tcp_server_socket((p), AF_UNSPEC)
00113 #define tcp_server_socket_ipv4(p) _tcp_server_socket((p), AF_INET)
00114 #define tcp_server_socket_ipv6(p) _tcp_server_socket((p), AF_INET6)
00115
00116 #define tcp_server_socket_setop(p, o, v, l) _tcp_server_socket_setopt((p), (o), (v), (l), AF_UNSPEC)
00117 #define tcp_server_socket_setop_ipv4(p, o, v, l) _tcp_server_socket_setopt((p), (o), (v), (l), AF_INET)
00118 #define tcp_server_socket_setop_ipv6(p, o, v, l) _tcp_server_socket_setopt((p), (o), (v), (l), AF_INET6)
00119
00120 #define tcp_server_bind(p) _tcp_server_bind((p), AF_UNSPEC)
00121 #define tcp_server_bind_ipv4(p) _tcp_server_bind((p), AF_INET)
00122 #define tcp_server_bind_ipv6(p) _tcp_server_bind((p), AF_INET6)
00123
00124 #define tcp_server_bind_setopt(p, o, v, l) _tcp_server_bind_setopt((p), (o), (v), (l), AF_UNSPEC)
00125 #define tcp_server_bind_setopt_ipv4(p, o, v, l) _tcp_server_bind_setopt((p), (o), (v), (l), AF_INET)
00126 #define tcp_server_bind_setopt_ipv6(p, o, v, l) _tcp_server_bind_setopt((p), (o), (v), (l), AF_INET6)
00127
00128 int _tcp_client_socket(char* hname, int port, int family);
00129 int _tcp_client_bind_socket(char* host, int sport, int cport, int family);
00130 int _tcp_bind(int sock, int port, int family);
00131 int _tcp_bind_setopt(int sock, int port, int opt, const void*, int len, int family);
00132 int _tcp_connect(int sock, char* host, int port, int family);
00133
00134 #define tcp_client_socket(h, p) _tcp_client_socket((h), (p), AF_UNSPEC)
00135 #define tcp_client_socket_ipv4(h, p) _tcp_client_socket((h), (p), AF_INET)
00136 #define tcp_client_socket_ipv6(h, p) _tcp_client_socket((h), (p), AF_INET6)
00137
00138 #define tcp_client_bind_socket(h, s, c) _tcp_client_bind_socket((h), (c), (s), AF_UNSPEC)
00139 #define tcp_client_bind_socket_ipv4(h, s, c) _tcp_client_bind_socket((h), (c), (s), AF_INET)
00140 #define tcp_client_bind_socket_ipv6(h, s, c) _tcp_client_bind_socket((h), (c), (s), AF_INET6)
00141
00142 #define tcp_bind(s, p) _tcp_bind((s), (p), AD_UNSPEC)
00143 #define tcp_bind_ipv4(s, p) _tcp_bind((s), (p), AD_INET)
00144 #define tcp_bind_ipv6(s, p) _tcp_bind((s), (p), AD_INET6)
00145
00146 #define tcp_bind_setopt(s, p, o, v, l) _tcp_bind_setopt((s), (p), (o), (v), (l), AF_UNSPEC)
00147 #define tcp_bind_setopt_ipv4(s, p, o, v, l) _tcp_bind_setopt((s), (p), (o), (v), (l), AF_INET)
00148 #define tcp_bind_setopt_ipv6(s, p, o, v, l) _tcp_bind_setopt((s), (p), (o), (v), (l), AF_INET6)
00149
00150 #define tcp_connect(s, h, p) _tcp_connect((s), (h), (p), AF_UNSPEC)
00151 #define tcp_connect_ipv4(s, h, p) _tcp_connect((s), (h), (p), AF_INET)
00152 #define tcp_connect_ipv6(s, h, p) _tcp_connect((s), (h), (p), AF_INET6)
00153
00154
00155 int accept_intr(int, struct sockaddr*, socklen_t*);
00156 int socket_close(int sock);
00157 int set_nonblock_socket(int sock);
00158 int set_block_socket(int sock);
00159
00160
00162
00163
00164 int get_valid_udp_socket(int min, int max, unsigned short* port);
00165 int get_valid_tcp_server_socket(int min, int max, unsigned short* port);
00166 int get_valid_tcp_client_socket(int min, int max, char* hostname, unsigned short sport, unsigned short* cport);
00167
00168
00170
00171
00172 int udp_recv(int, char*, int, struct addrinfo*);
00173 int udp_send(int, char*, int, struct addrinfo*);
00174 int tcp_recv(int, char*, int);
00175 int tcp_send(int, char*, int);
00176
00177 int udp_recv_wait(int sock, char* data, int size, struct addrinfo* sv_addr, int tm);
00178 int tcp_recv_wait(int sock, char* data, int sz, int tm);
00179
00180 int tcp_send_mesgln(int, char*);
00181 int tcp_recv_mstream(int sock, char* mesg, int sz, mstream* sb, int tm);
00182
00183 int recv_wait(int sock, int tm);
00184 int recv_wait_twin(int sock1, int sock2, int tm);
00185 int send_wait(int sock, int tm);
00186
00187 #define udp_send_mesg(s, m, a) udp_send((s), (m), 0, (a))
00188 #define tcp_send_mesg(s, m) tcp_send((s), (m), 0)
00189
00190
00192
00193
00194 struct sockaddr* make_sockaddr_bynum(unsigned char* addr, int port, int family);
00195 struct sockaddr* make_sockaddr_bystr(const char* addr, int port);
00196
00197 #define make_sockaddr_bynum_ipv4(a, p) make_sockaddr_bynum((a), (p), AF_INET)
00198 #define make_sockaddr_bynum_ipv6(a, p) make_sockaddr_bynum((a), (p), AF_INET6)
00199
00200 char* _get_hostname(const char* host, int family);
00201
00202 #define get_hostname(h) _get_hostname((h), AF_UNSPEC)
00203 #define get_hostname_ipv4(h) _get_hostname((h), AF_INET)
00204 #define get_hostname_ipv6(h) _get_hostname((h), AF_INET6)
00205
00206 char* get_hostname_bynum(unsigned char* bin, int family);
00207 char* get_hostname_bystr(const char* str);
00208
00209 #define get_hostname_bynum_ipv4(n) get_hostname_bynum((n), AF_INET)
00210 #define get_hostname_bynum_ipv6(n) get_hostname_bynum((n), AF_INET6)
00211
00212 char* get_ipaddr_byname(const char* host, int family);
00213 unsigned char* get_ipaddr_byname_num(const char* h, int family);
00214
00215 #define get_ipaddr_byname_ipv4(h) get_ipaddr_byname((h), AF_INET)
00216 #define get_ipaddr_byname_ipv6(h) get_ipaddr_byname((h), AF_INET6)
00217 #define get_ipaddr_byname_num_ipv4(h) get_ipaddr_byname_num((h), AF_INET)
00218 #define get_ipaddr_byname_num_ipv6(h) get_ipaddr_byname_num((h), AF_INET6)
00219
00220 char* get_myipaddr(int family);
00221 unsigned char* get_myipaddr_num(int family);
00222
00223 #define get_myipaddr_ipv4() get_myipaddr(AF_INET)
00224 #define get_myipaddr_ipv6() get_myipaddr(AF_INET6)
00225 #define get_myipaddr_num_ipv4() get_myipaddr_num(AF_INET)
00226 #define get_myipaddr_num_ipv6() get_myipaddr_num(AF_INET6)
00227
00228 char* _get_localip_bydest(const char* host, int family);
00229
00230 #define get_localip_bydest(h) _get_localip_bydest((h), AF_UNSPEC)
00231 #define get_localip_bydest_ipv4(h) _get_localip_bydest((h), AF_INET)
00232 #define get_localip_bydest_ipv6(h) _get_localip_bydest((h), AF_INET6)
00233
00234 #define get_localip() _get_localip_bydest("www.google.co.jp", AF_UNSPEC)
00235 #define get_localip_ipv4() _get_localip_bydest("www.google.co.jp", AF_INET)
00236 #define get_localip_ipv6() _get_localip_bydest("www.google.co.jp", AF_INET6)
00237
00238 unsigned char* get_mynetaddr_num(int family);
00239 char* get_mynetaddr(int family);
00240
00241 #define get_mynetaddr_num_ipv4() get_mynetaddr_num(AF_INET)
00242 #define get_mynetaddr_num_ipv6() get_mynetaddr_num(AF_INET6)
00243 #define get_mynetaddr_ipv4() get_mynetaddr(AF_INET)
00244 #define get_mynetaddr_ipv6() get_mynetaddr(AF_INET6)
00245
00246
00248
00249
00250 unsigned char* to_address_num(char*, int md, int mk, int family);
00251 char* to_address_char(unsigned char* addr, int mask, int family);
00252
00253 #define to_address_num8_ipv4(a, m) to_address_num((a), (m), 1, AF_INET)
00254 #define to_address_num4_ipv4(a, m) to_address_num((a), (m), 0, AF_INET)
00255 #define to_address_char8_ipv4(a) to_address_char((a), 1, AF_INET)
00256 #define to_address_char4_ipv4(a) to_address_char((a), 0, AF_INET)
00257
00258 #define to_address_num32_ipv6(a, m) to_address_num((a), (m), 1, AF_INET6)
00259 #define to_address_num16_ipv6(a, m) to_address_num((a), (m), 0, AF_INET6)
00260 #define to_address_char32_ipv6(a) to_address_char((a), 1, AF_INET6)
00261 #define to_address_char16_ipv6(a) to_address_char((a), 0, AF_INET6)
00262
00263 int is_same_sockaddr(struct sockaddr* addr1, struct sockaddr* addr2);
00264 int is_same_network(char* addr1, char* addr2, char* mask);
00265 int is_same_network_num(unsigned char* addr1, unsigned char* addr2, unsigned char* mask, int family);
00266
00267 #define is_same_network_num_ipv4(a1, a2, m) is_same_network_num((a1), (a2), (m), AF_INET)
00268 #define is_same_network_num_ipv6(a1, a2, m) is_same_network_num((a1), (a2), (m), AF_INET6)
00269
00270 void udp_hole_punching(int sock, struct addrinfo* addr, int num);
00271
00272
00273
00275
00276
00277 int udp_client_socket_sockaddr_in(char*, int, struct sockaddr_in*);
00278
00279 int udp_recv_sockaddr_in(int, char*, int, struct sockaddr_in*);
00280 int udp_send_sockaddr_in(int, char*, int, struct sockaddr_in*);
00281 int udp_recv_wait_sockaddr_in(int sock, char* data, int size, struct sockaddr_in* sv_addr, int tm);
00282
00283 #define udp_send_mesg_sockaddr_in(s, m, a) udp_send_sockaddr_in((s), (m), 0, (a))
00284
00285 struct sockaddr_in get_sockaddr_in(char* hostname, unsigned short cport);
00286 struct sockaddr_in get_sockaddr_in_bynum(char* ipnum, unsigned short cport);
00287 struct sockaddr_in get_local_sockaddr_in(unsigned short cport);
00288
00289
00290 #define is_same_sockaddr_in(a, b) is_same_sockaddr((struct sockaddr*)&(a), (struct sockaddr*)&(b))
00291
00292 unsigned char* get_ipaddr_num_ipv4(struct in_addr);
00293 char* get_ipaddr_ipv4(struct in_addr);
00294
00295 void udp_hole_punching_sockaddr_in(int sock, struct sockaddr_in addr, int nm);
00296
00297
00298 #endif // __JBXL_NETWORK_H_
00299
00300
00303