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