JunkBox_Lib  1.10.2
network.c File Reference

ネットワーク用ライブラリ for IPv4/IPv6 More...

#include "network.h"
#include <time.h>
#include <ifaddrs.h>
Include dependency graph for network.c:

Go to the source code of this file.

Functions

int init_network (void)
 
void cleanup_network (void)
 
int _udp_server_socket (int port, struct addrinfo **sv_addr, int family)
 call socket(), bind() More...
 
int _udp_server_socket_setopt (int port, int opt, const void *optval, int optlen, struct addrinfo **sv_addr, int family)
 call socket(), setsockopt(), bind() More...
 
int _udp_client_socket (char *hostname, int port, struct addrinfo **sv_addr, int family)
 call socket() More...
 
int _udp_bind (int sofd, int port, int family)
 call bind() More...
 
int _udp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen, int family)
 call setsockopt(), bind() More...
 
int _tcp_server_socket (int port, int family)
 call socket(), bind(), listen() More...
 
int _tcp_server_socket_setopt (int port, int opt, const void *optval, int optlen, int family)
 call socket(), setsockopt(), bind(), listen() More...
 
int _tcp_server_bind (int port, int family)
 call socket(), bind() More...
 
int _tcp_server_bind_setopt (int port, int opt, const void *optval, int optlen, int family)
 call socket(), setsockopt(), bind() More...
 
int _tcp_client_socket (char *hostname, int port, int family)
 call socket(), connect() More...
 
int _tcp_client_bind_socket (char *hostname, int sport, int cport, int family)
 call socket(), bind(), connect() More...
 
int _tcp_bind (int sofd, int port, int family)
 call bind() More...
 
int _tcp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen, int family)
 call setsockopt(), bind() More...
 
int _tcp_connect (int sofd, char *hostname, int port, int family)
 call connect() More...
 
int accept_intr (int sock, struct sockaddr *cl_addr, socklen_t *cdlen)
 call accept() More...
 
int socket_close (int sofd)
 call shutdown(), close() More...
 
int set_nonblock_socket (int sock)
 
int set_block_socket (int sock)
 
int get_valid_udp_socket (int min, int max, unsigned short *port)
 
int get_valid_tcp_server_socket (int min, int max, unsigned short *port)
 
int get_valid_tcp_client_socket (int min, int max, char *hname, unsigned short sport, unsigned short *cport)
 
int udp_recv (int sock, char *rmsg, int size, struct addrinfo *sv_addr)
 
int udp_send (int sock, char *smsg, int size, struct addrinfo *sv_addr)
 
int tcp_recv (int sock, char *rmsg, int size)
 
int tcp_send (int sock, char *smsg, int size)
 
int udp_recv_wait (int sock, char *rmsg, int size, struct addrinfo *sv_addr, int tm)
 
int tcp_recv_wait (int sock, char *mesg, int sz, int tm)
 
int tcp_send_mesgln (int sock, char *mesg)
 
int tcp_recv_mstream (int sock, char *mesg, int sz, mstream *sb, int tm)
 
int recv_wait (int sock, int tm)
 
int recv_wait_twin (int sock1, int sock2, int tm)
 
int send_wait (int sock, int tm)
 
struct sockaddr * make_sockaddr_bynum (unsigned char *addr, int port, int family)
 IPv4/IPv6 対応 More...
 
struct sockaddr * make_sockaddr_bystr (const char *addr, int port)
 IPv4/IPv6 対応 More...
 
char * get_hostname_bynum (unsigned char *num, int family)
 IPv4/IPv6 アドレス(バイナリ)→ ホスト名(文字列) More...
 
char * get_hostname_bystr (const char *addr)
 IPv4/IPv6 アドレス(文字列) → ホスト名(文字列) More...
 
char * _get_hostname (const char *addr, int family)
 IPv4/IPv6 アドレス(文字列), FQDN → ホスト名(文字列) More...
 
char * get_ipaddr_byname (const char *hostname, int family)
 ホスト名 → IPv4/IPv6 アドレス(文字列) More...
 
unsigned char * get_ipaddr_byname_num (const char *hostname, int family)
 ホスト名 → IPv4/IPv6 アドレス(バイナリ) More...
 
char * get_myipaddr (int family)
 自分の [IPv4/IPv6 ネットワークアドレス]/[ネットマスク](文字列) More...
 
unsigned char * get_myipaddr_num (int family)
 自分の [IPv4/IPv6 アドレス],[ネットマスク](バイナリ) More...
 
char * _get_localip_bydest (const char *dest, int family)
 自分の IPv4/IPv6 アドレス(文字列) More...
 
char * get_mynetaddr (int family)
 自分の IPv4/IPv6 ネットワークアドレス(文字列) More...
 
unsigned char * get_mynetaddr_num (int family)
 自分の IPv4/IPv6 ネットワークアドレス(バイナリ) More...
 
int is_same_sockaddr (struct sockaddr *addr1, struct sockaddr *addr2)
 
int is_same_network (char *addr1, char *addr2, char *mask)
 
int is_same_network_num (unsigned char *addr1, unsigned char *addr2, unsigned char *mask, int family)
 
unsigned char * to_address_num (char *addr, int mode, int mask, int family)
 IPv4/IPv6 アドレス(文字列)→ [IPv4/IPv6 アドレス],[ネットマスク](数字8/32Byte) More...
 
char * to_address_char (unsigned char *addr, int mask, int family)
 [IPv4/IPv6 アドレス],[ネットマスク](数字8/32Byte)→ IPv4/IPv6 アドレス(文字列) More...
 
void udp_hole_punching (int sock, struct addrinfo *addr, int nm)
 
int udp_client_socket_sockaddr_in (char *hostname, int port, struct sockaddr_in *sv_addr)
 use udp_client_socket() More...
 
int udp_recv_sockaddr_in (int sock, char *rmsg, int size, struct sockaddr_in *sv_addr)
 use udp_recv() More...
 
int udp_send_sockaddr_in (int sock, char *smsg, int size, struct sockaddr_in *sv_addr)
 use udp_send() More...
 
int udp_recv_wait_sockaddr_in (int sock, char *rmsg, int size, struct sockaddr_in *sv_addr, int tm)
 use udp_recv_wait() More...
 
struct sockaddr_in get_sockaddr_in (char *hostname, unsigned short cport)
 
struct sockaddr_in get_sockaddr_in_bynum (char *ipnum, unsigned short cport)
 
struct sockaddr_in get_local_sockaddr_in (unsigned short cport)
 
char * get_ipaddr_ipv4 (struct in_addr sin_addr)
 構造体 → IPv4 アドレス(文字列) use get_ipaddr_byname() More...
 
unsigned char * get_ipaddr_num_ipv4 (struct in_addr sin_addr)
 構造体 → IPv4 アドレス(バイナリ) use get_ipaddr_byname_num() More...
 
void udp_hole_punching_sockaddr_in (int sock, struct sockaddr_in addr, int nm)
 use udp_hole_punching() More...
 

Detailed Description

Author
Fumi.Iseki (C)

Definition in file network.c.

Function Documentation

◆ _get_hostname()

char* _get_hostname ( const char *  addr,
int  family 
)

char* _get_hostname(const char* addr, int family)

IPv4/IPv6 アドレス(文字列)からホスト名を逆引きする.

FQDNを指定した場合は,正引きして逆引きするので,FQDNのチェックに使用できる.

Parameters
addrIPアドレス(文字列)または FQDN
familyプロトコルファミリー(AF_INET/AF_INET6)
Returns
ホスト名(文字列).要 free

Definition at line 1729 of file network.c.

1730 {
1731  int len, err;
1732  char htemp[LNAME];
1733  char* hname = NULL;
1734 
1735  struct addrinfo hints;
1736  struct addrinfo* address;
1737  struct sockaddr* sa;
1738 
1739  if (addr==NULL) return NULL;
1740  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
1741 
1742  memset(&hints, 0, sizeof(struct addrinfo));
1743  hints.ai_family = family;
1744  hints.ai_flags = AI_PASSIVE;
1745  hints.ai_socktype = SOCK_DGRAM;
1746 
1747  err = getaddrinfo(addr, 0, &hints, &address);
1748  if (err!=0 || address==NULL) return NULL;
1749  sa = (struct sockaddr*)address->ai_addr;
1750 
1751  if (sa->sa_family==AF_INET6) len = sizeof(struct sockaddr_in6);
1752  else len = sizeof(struct sockaddr_in);
1753  err = getnameinfo(sa, len, htemp, LNAME-1, NULL, 0, 0);
1754  if (err!=0) {
1755  freeaddrinfo(address);
1756  return NULL;
1757  }
1758 
1759  len = (int)strlen(htemp);
1760  hname = (char*)malloc(len+1);
1761  if (hname==NULL) {
1762  freeaddrinfo(address);
1763  return NULL;
1764  }
1765 
1766  freeaddrinfo(address);
1767  memcpy(hname, htemp, len+1);
1768  return hname;
1769 }
#define LNAME
Definition: common.h:153
unsigned char unsigned long * len
Definition: jpeg_tool.h:96

References len, and LNAME.

◆ _get_localip_bydest()

char* _get_localip_bydest ( const char *  dest,
int  family 
)

char* _get_localip_bydest(const char* dest, int family)

接続先を指定して,そこへ接続する インターフェイスのIPアドレスを得る.自分自身の IPアドレスを得るもう一つの方法.

Parameters
dest接続先の IPv4/IPv6 アドレス または FQDN
familyプロトコルファミリー(AF_INET/AF_INET6)
Returns
IPv4/IPv6 アドレス(文字列)へのポインタ.要 free

Definition at line 2064 of file network.c.

2065 {
2066  int sofd, err, len;
2067  char* addr;
2068  unsigned char* pp;
2069  struct addrinfo hints;
2070  struct addrinfo* sv_addr;
2071  struct sockaddr* sa;
2072 
2073  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
2074 
2075  memset(&hints, 0, sizeof(struct addrinfo));
2076  hints.ai_family = family;
2077  hints.ai_flags = AI_PASSIVE;
2078  hints.ai_socktype = SOCK_DGRAM;
2079 
2080  err = getaddrinfo(dest, "9999", &hints, &sv_addr);
2081  if (err != 0) {
2082  // if 10093 error is occured, execute init_network()
2083  return NULL;
2084  }
2085 
2086  sofd = (int)socket(sv_addr->ai_family, sv_addr->ai_socktype, sv_addr->ai_protocol);
2087  if (sofd<0) {
2088  freeaddrinfo(sv_addr);
2089  return NULL;
2090  }
2091 
2092  err = connect(sofd, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
2093  if (err<0) {
2094  socket_close(sofd);
2095  return NULL;
2096  }
2097 
2098  if (sv_addr->ai_family==AF_INET6) {
2099  len = sizeof(struct sockaddr_in6);
2100  sa = (struct sockaddr*)malloc(len);
2101  memset(sa, 0, len);
2102  err = getsockname(sofd, (struct sockaddr *)sa, (socklen_t*)&len);
2103  //pp = (unsigned char*)(((struct sockaddr_in6*)sa)->sin6_addr.s6_addr);
2104  pp = (unsigned char*)&(((struct sockaddr_in6*)sa)->sin6_addr);
2105  len = LEN_IPADDR6;
2106  }
2107  else {
2108  len = sizeof(struct sockaddr_in);
2109  sa = (struct sockaddr*)malloc(len);
2110  memset(sa, 0, len);
2111  err = getsockname(sofd, (struct sockaddr *)sa, (socklen_t*)&len);
2112  //pp = (unsigned char*)(&((struct sockaddr_in*)sa)->sin_addr.s_addr);
2113  pp = (unsigned char*)&(((struct sockaddr_in*)sa)->sin_addr);
2114  len = LEN_IPADDR;
2115  }
2116 
2117  freeaddrinfo(sv_addr);
2118  socket_close(sofd);
2119 
2120  addr = (char*)malloc(len);
2121  if (addr==NULL) {
2122  free(sa);
2123  return NULL;
2124  }
2125  memset(addr, 0, len);
2126 
2127  inet_ntop(family, pp, addr, len);
2128  free(sa);
2129  return addr;
2130 }
#define LEN_IPADDR
strlen("AAA.BBB.CCC.DDD") + '\0' + 1(予備)
Definition: common.h:172
#define LEN_IPADDR6
strlen("1111:2222:333:4444:5555:6666:7777:8888") + '\0' + 1(予備)
Definition: common.h:173
int socket_close(int sofd)
call shutdown(), close()
Definition: network.c:1022

References len, LEN_IPADDR, LEN_IPADDR6, and socket_close().

Here is the call graph for this function:

◆ _tcp_bind()

int _tcp_bind ( int  sofd,
int  port,
int  family 
)

int _tcp_bind(int sofd, int port, int family)

IPv4/IPv6 のTCPソケットにポートをバインドする.

Parameters
sofdバインドするソケットの記述子.
portポート番号
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 834 of file network.c.

835 {
836  int err;
837  struct addrinfo hints;
838  struct addrinfo* address;
839 
840  if (sofd<=0) return sofd;
841  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
842 
843  memset(&hints, 0, sizeof(struct addrinfo));
844  hints.ai_family = family;
845  hints.ai_flags = AI_PASSIVE;
846  hints.ai_socktype = SOCK_STREAM;
847 
848  char* str = itostr_ts(port);
849  err = getaddrinfo(NULL, str, &hints, &address);
850  freeNull(str);
851  if (err!=0) {
852  socket_close(sofd);
853  return JBXL_NET_INFO_ERROR;
854  }
855 
856  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
857  if (err<0) {
858  freeaddrinfo(address);
859  socket_close(sofd);
860  return JBXL_NET_BIND_ERROR;
861  }
862 
863  freeaddrinfo(address);
864  return sofd;
865 }
#define JBXL_NET_INFO_ERROR
ホスト情報の取得に失敗
Definition: jbxl_state.h:67
#define JBXL_NET_BIND_ERROR
バインドに失敗
Definition: jbxl_state.h:66
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition: tools.c:1532
#define freeNull(p)
Definition: tools.h:201

References freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, and socket_close().

Here is the call graph for this function:

◆ _tcp_bind_setopt()

int _tcp_bind_setopt ( int  sofd,
int  port,
int  opt,
const void *  optval,
int  optlen,
int  family 
)

int _tcp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen, int family)

IPv4/IPv6 のTCPソケットにポートをバインドする.オプションの指定(setsockopt)が可能.

Parameters
sofdバインドするソケットの記述子.
portポート番号
optオプションの種類
optvalオプションデータ
optlenoptval の長さ
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_OPTION_ERRORオプションの設定に失敗.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 886 of file network.c.

887 {
888  int err;
889  struct addrinfo hints;
890  struct addrinfo* address;
891 
892  if (sofd<=0) return sofd;
893  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
894 
895  if (opt>0) {
896  #ifdef WIN32
897  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
898  #else
899  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
900  #endif
901  if (err<0) {
902  socket_close(sofd);
903  return JBXL_NET_OPTION_ERROR;
904  }
905  }
906 
907  memset(&hints, 0, sizeof(struct addrinfo));
908  hints.ai_family = family;
909  hints.ai_flags = AI_PASSIVE;
910  hints.ai_socktype = SOCK_STREAM;
911 
912  char* str = itostr_ts(port);
913  err = getaddrinfo(NULL, str, &hints, &address);
914  freeNull(str);
915  if (err!=0) {
916  socket_close(sofd);
917  return JBXL_NET_INFO_ERROR;
918  }
919 
920  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
921  if (err<0) {
922  freeaddrinfo(address);
923  socket_close(sofd);
924  return JBXL_NET_BIND_ERROR;
925  }
926 
927  freeaddrinfo(address);
928  return sofd;
929 }
#define JBXL_NET_OPTION_ERROR
オプションの設定に失敗
Definition: jbxl_state.h:65

References freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, and socket_close().

Here is the call graph for this function:

◆ _tcp_client_bind_socket()

int _tcp_client_bind_socket ( char *  hostname,
int  sport,
int  cport,
int  family 
)

int _tcp_client_bind_socket(char* hostname, int sport, int cport, int family)

IPv4/IPv6 のTCPのクライアントソケットを作り,サーバに接続する.

この関数内で呼び出されるネットワーク関数: socket(), bind(), getaddrinfo(), connect()

Parameters
hostnameサーバ名
sportサーバポート番号
cport自分のポート番号
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.
JBXL_NET_CONNECT_ERROR接続に失敗.

Definition at line 767 of file network.c.

768 {
769  int sofd, err;
770  struct addrinfo hints;
771  struct addrinfo* address;
772 
773  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
774 
775  memset(&hints, 0, sizeof(struct addrinfo));
776  hints.ai_family = family;
777  hints.ai_flags = AI_PASSIVE;
778  hints.ai_socktype = SOCK_STREAM;
779 
780  char* str = itostr_ts(cport);
781  err = getaddrinfo(NULL, str, &hints, &address);
782  freeNull(str);
783  if (err!=0) return JBXL_NET_INFO_ERROR;
784 
785  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
786  if (sofd<0) {
787  freeaddrinfo(address);
788  return JBXL_NET_SOCKET_ERROR;
789  }
790 
791  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
792  if (err<0) {
793  freeaddrinfo(address);
794  socket_close(sofd);
795  return JBXL_NET_BIND_ERROR;
796  }
797  freeaddrinfo(address);
798 
799  //
800  str = itostr_ts(sport);
801  err = getaddrinfo(hostname, str, &hints, &address);
802  freeNull(str);
803  if (err!=0) {
804  socket_close(sofd);
805  return JBXL_NET_INFO_ERROR;
806  }
807 
808  err = connect(sofd, address->ai_addr, (int)address->ai_addrlen);
809  if (err<0) {
810  freeaddrinfo(address);
811  socket_close(sofd);
812  return JBXL_NET_CONNECT_ERROR;
813  }
814 
815  freeaddrinfo(address);
816  return sofd;
817 }
#define JBXL_NET_SOCKET_ERROR
ソケットの作成に失敗
Definition: jbxl_state.h:64
#define JBXL_NET_CONNECT_ERROR
接続に失敗
Definition: jbxl_state.h:68

References freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_CONNECT_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_SOCKET_ERROR, and socket_close().

Here is the call graph for this function:

◆ _tcp_client_socket()

int _tcp_client_socket ( char *  hostname,
int  port,
int  family 
)

int _tcp_client_socket(char* hostname, int port, int family)

IPv4/IPv6 のTCPのクライアントソケットを作り,サーバに接続する.

この関数内で呼び出されるネットワーク関数: socket(), getaddrinfo(), connect()

Parameters
hostnameサーバ名
portサーバポート番号
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.
JBXL_NET_CONNECT_ERROR接続に失敗.

Definition at line 712 of file network.c.

713 {
714  int sofd, err;
715  struct addrinfo hints;
716  struct addrinfo* address;
717 
718  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
719 
720  memset(&hints, 0, sizeof(struct addrinfo));
721  hints.ai_family = family;
722  hints.ai_flags = AI_PASSIVE;
723  hints.ai_socktype = SOCK_STREAM;
724 
725  char* str = itostr_ts(port);
726  err = getaddrinfo(hostname, str, &hints, &address);
727  freeNull(str);
728  if (err!=0) return JBXL_NET_INFO_ERROR;
729 
730  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
731  if (sofd<0) {
732  freeaddrinfo(address);
733  return JBXL_NET_SOCKET_ERROR;
734  }
735 
736  err = connect(sofd, address->ai_addr, (int)address->ai_addrlen);
737  if (err<0) {
738  freeaddrinfo(address);
739  socket_close(sofd);
740  return JBXL_NET_CONNECT_ERROR;
741  }
742 
743  freeaddrinfo(address);
744  return sofd;
745 }

References freeNull, itostr_ts(), JBXL_NET_CONNECT_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_SOCKET_ERROR, and socket_close().

Here is the call graph for this function:

◆ _tcp_connect()

int _tcp_connect ( int  sofd,
char *  hostname,
int  port,
int  family 
)

Definition at line 949 of file network.c.

950 {
951  int err;
952  struct addrinfo hints;
953  struct addrinfo* address;
954 
955  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
956 
957  memset(&hints, 0, sizeof(struct addrinfo));
958  hints.ai_family = family;
959  hints.ai_flags = AI_PASSIVE;
960  hints.ai_socktype = SOCK_STREAM;
961 
962  char* str = itostr_ts(port);
963  err = getaddrinfo(hostname, str, &hints, &address);
964  freeNull(str);
965  if (err!=0) {
966  socket_close(sofd);
967  return JBXL_NET_INFO_ERROR;
968  }
969 
970  err = connect(sofd, address->ai_addr, (int)address->ai_addrlen);
971  if (err<0) {
972  freeaddrinfo(address);
973  socket_close(sofd);
974  return JBXL_NET_CONNECT_ERROR;
975  }
976 
977  freeaddrinfo(address);
978  return 0;
979 }

References freeNull, itostr_ts(), JBXL_NET_CONNECT_ERROR, JBXL_NET_INFO_ERROR, and socket_close().

Here is the call graph for this function:

◆ _tcp_server_bind()

int _tcp_server_bind ( int  port,
int  family 
)

int _tcp_server_bind(int port, int family)

IPv4/IPv6 のTCPのサーバのソケット記述子を作り,バインドする. tcp_server_socket() との違いは listen()関数を呼び出さない点にある.

この関数内で呼び出されるネットワーク関数: socket(), bind()

Parameters
portポート番号.
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 562 of file network.c.

563 {
564  int sofd, err;
565  struct addrinfo hints;
566  struct addrinfo* address;
567  int nonblock = FALSE;
568 
569  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
570 
571  memset(&hints, 0, sizeof(struct addrinfo));
572  hints.ai_family = family;
573  hints.ai_flags = AI_PASSIVE;
574  hints.ai_socktype = SOCK_STREAM;
575 
576  if (port<0) {
577  nonblock = TRUE;
578  port = -port;
579  }
580 
581  char* str = itostr_ts(port);
582  err = getaddrinfo(NULL, str, &hints, &address);
583  freeNull(str);
584  if (err!=0) return JBXL_NET_INFO_ERROR;
585 
586  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
587  if (sofd<0) {
588  freeaddrinfo(address);
589  return JBXL_NET_SOCKET_ERROR;
590  }
591  if (nonblock) sofd = set_nonblock_socket(sofd);
592 
593  // TIME_WAIT しない設定.
594  int lg = 1;
595  #ifdef WIN32
596  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, (const char*)&lg, sizeof(lg));
597  #else
598  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, &lg, sizeof(lg));
599  #endif
600  if (err<0) {
601  freeaddrinfo(address);
602  socket_close(sofd);
603  return JBXL_NET_OPTION_ERROR;
604  }
605 
606  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
607  if (err<0) {
608  freeaddrinfo(address);
609  socket_close(sofd);
610  return JBXL_NET_BIND_ERROR;
611  }
612 
613  freeaddrinfo(address);
614  return sofd;
615 }
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
int set_nonblock_socket(int sock)
Definition: network.c:1043

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ _tcp_server_bind_setopt()

int _tcp_server_bind_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen,
int  family 
)

int _tcp_server_bind_setopt(int port, int opt, const void* optval, int optlen, int family)

IPv4/IPv6 のTCPのサーバのソケット記述子を作り,バインドする.オプションの指定(setsockopt)が可能. tcp_server_socket() との違いは listen()関数を呼び出さない点にある.

この関数内で呼び出されるネットワーク関数: socket(), setsockopt(), bind()

Parameters
portポート番号
optオプションの種類
optvalオプションデータ
optlenoptval の長さ
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_OPTION_ERRORオプションの設定に失敗.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 639 of file network.c.

640 {
641  int sofd, err;
642  struct addrinfo hints;
643  struct addrinfo* address;
644  int nonblock = FALSE;
645 
646  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
647 
648  memset(&hints, 0, sizeof(struct addrinfo));
649  hints.ai_family = family;
650  hints.ai_flags = AI_PASSIVE;
651  hints.ai_socktype = SOCK_STREAM;
652 
653  if (port<0) {
654  nonblock = TRUE;
655  port = -port;
656  }
657 
658  char* str = itostr_ts(port);
659  err = getaddrinfo(NULL, str, &hints, &address);
660  freeNull(str);
661  if (err!=0) return JBXL_NET_INFO_ERROR;
662 
663  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
664  if (sofd<0) {
665  freeaddrinfo(address);
666  return JBXL_NET_SOCKET_ERROR;
667  }
668  if (nonblock) sofd = set_nonblock_socket(sofd);
669 
670  if (opt>0) {
671  #ifdef WIN32
672  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
673  #else
674  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
675  #endif
676  if (err<0) {
677  freeaddrinfo(address);
678  socket_close(sofd);
679  return JBXL_NET_OPTION_ERROR;
680  }
681  }
682 
683  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
684  if (err<0) {
685  freeaddrinfo(address);
686  socket_close(sofd);
687  return JBXL_NET_BIND_ERROR;
688  }
689 
690  freeaddrinfo(address);
691  return sofd;
692 }

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ _tcp_server_socket()

int _tcp_server_socket ( int  port,
int  family 
)

int _tcp_server_socket(int port, int family)

IPv4/IPv6 のTCPのサーバソケットを作り,リッスンにより接続要求を受けられる状態にする.
この関数に続いて accept()関数を呼ぶ事により,実際の接続待ち状態となる.

この関数内で呼び出されるネットワーク関数は socket(), bind(), listen()

Parameters
portポート番号.マイナスの場合は ノンブロックとなる.
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.
JBXL_NET_LISTEN_ERRORリッスンに失敗.

Definition at line 396 of file network.c.

397 {
398  int sofd, err;
399  struct addrinfo hints;
400  struct addrinfo* address;
401  int nonblock = FALSE;
402 
403  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
404 
405  memset(&hints, 0, sizeof(struct addrinfo));
406  hints.ai_family = family;
407  hints.ai_flags = AI_PASSIVE;
408  hints.ai_socktype = SOCK_STREAM;
409 
410  if (port<0) {
411  nonblock = TRUE;
412  port = -port;
413  }
414 
415  char* str = itostr_ts(port);
416  err = getaddrinfo(NULL, str, &hints, &address);
417  freeNull(str);
418  if (err!=0) return JBXL_NET_INFO_ERROR;
419 
420  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
421  if (sofd<0) {
422  freeaddrinfo(address);
423  return JBXL_NET_SOCKET_ERROR;
424  }
425  if (nonblock) sofd = set_nonblock_socket(sofd);
426 
427  // TIME_WAIT しない設定.
428  int lg = 1;
429  #ifdef WIN32
430  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, (const char*)&lg, sizeof(lg));
431  #else
432  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, &lg, sizeof(lg));
433  #endif
434  if (err<0) {
435  freeaddrinfo(address);
436  socket_close(sofd);
437  return JBXL_NET_OPTION_ERROR;
438  }
439 
440  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
441  if (err<0) {
442  freeaddrinfo(address);
443  socket_close(sofd);
444  return JBXL_NET_BIND_ERROR;
445  }
446 
447  err = listen(sofd, 10);
448  if (err==-1) {
449  freeaddrinfo(address);
450  socket_close(sofd);
451  return JBXL_NET_LISTEN_ERROR;
452  }
453 
454  freeaddrinfo(address);
455  return sofd;
456 }
#define JBXL_NET_LISTEN_ERROR
リッスンに失敗
Definition: jbxl_state.h:69

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_LISTEN_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ _tcp_server_socket_setopt()

int _tcp_server_socket_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen,
int  family 
)

int _tcp_server_socket_setopt(int port, int opt, const void* optval, int optlen, int family)

IPv4/IPv6 のTCPのサーバソケットを作り,リッスンにより接続要求を受けられる状態にする.
この関数に続いて accept()関数を呼ぶ事により,実際の接続待ち状態となる. オプションの指定(setsockopt)が可能.

この関数内で呼び出されるネットワーク関数は socket(), setsockopt(), bind(), listen()

Parameters
portポート番号.マイナスの場合は ノンブロックとなる.
optオプションの種類
optvalオプションデータ
optlenoptval の長さ
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_OPTION_ERRORオプションの設定に失敗.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.
JBXL_NET_LISTEN_ERRORリッスンに失敗.

Definition at line 482 of file network.c.

483 {
484  int sofd, err;
485  struct addrinfo hints;
486  struct addrinfo* address;
487  int nonblock = FALSE;
488 
489  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
490 
491  memset(&hints, 0, sizeof(struct addrinfo));
492  hints.ai_family = family;
493  hints.ai_flags = AI_PASSIVE;
494  hints.ai_socktype = SOCK_STREAM;
495 
496  if (port<0) {
497  nonblock = TRUE;
498  port = -port;
499  }
500 
501  char* str = itostr_ts(port);
502  err = getaddrinfo(NULL, str, &hints, &address);
503  freeNull(str);
504  if (err!=0) return JBXL_NET_INFO_ERROR;
505 
506  sofd = (int)socket(address->ai_family, address->ai_socktype, address->ai_protocol);
507  if (sofd<0) {
508  freeaddrinfo(address);
509  return JBXL_NET_SOCKET_ERROR;
510  }
511  if (nonblock) sofd = set_nonblock_socket(sofd);
512 
513  if (opt>0) {
514  #ifdef WIN32
515  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
516  #else
517  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
518  #endif
519  if (err<0) {
520  freeaddrinfo(address);
521  socket_close(sofd);
522  return JBXL_NET_OPTION_ERROR;
523  }
524  }
525 
526  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
527  if (err<0) {
528  freeaddrinfo(address);
529  socket_close(sofd);
530  return JBXL_NET_BIND_ERROR;
531  }
532 
533  err = listen(sofd, 10);
534  if (err==-1) {
535  freeaddrinfo(address);
536  socket_close(sofd);
537  return JBXL_NET_LISTEN_ERROR;
538  }
539 
540  freeaddrinfo(address);
541  return sofd;
542 }

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_LISTEN_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ _udp_bind()

int _udp_bind ( int  sofd,
int  port,
int  family 
)

int _udp_bind(int sofd, int port, int family)

UDPソケットにポートをバインドする.

Parameters
sofdバインドするソケットの記述子.
portポート番号
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 283 of file network.c.

284 {
285  int err;
286  struct addrinfo hints;
287  struct addrinfo* address;
288 
289  if (sofd<=0) return sofd;
290  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
291 
292  memset(&hints, 0, sizeof(struct addrinfo));
293  hints.ai_family = family;
294  hints.ai_flags = AI_PASSIVE;
295  hints.ai_socktype = SOCK_DGRAM;
296 
297  char* str = itostr_ts(port);
298  err = getaddrinfo(NULL, str, &hints, &address);
299  freeNull(str);
300  if (err!=0) return JBXL_NET_INFO_ERROR;
301 
302  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
303  if (err<0) {
304  freeaddrinfo(address);
305  socket_close(sofd);
306  return JBXL_NET_BIND_ERROR;
307  }
308 
309  freeaddrinfo(address);
310  return sofd;
311 }

References freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, and socket_close().

Here is the call graph for this function:

◆ _udp_bind_setopt()

int _udp_bind_setopt ( int  sofd,
int  port,
int  opt,
const void *  optval,
int  optlen,
int  family 
)

int _udp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen, int family)

IPv4/IPv6 のUDPソケットにポートをバインドする.オプションの指定(setsockopt)が可能.

Parameters
sofdバインドするソケットの記述子.
portポート番号
optオプションの種類
optvalオプションデータ
optlenoptval の長さ
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_OPTION_ERRORオプションの設定に失敗.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 332 of file network.c.

333 {
334  int err;
335  struct addrinfo hints;
336  struct addrinfo* address;
337 
338  if (sofd<=0) return sofd;
339  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
340 
341  if (opt>0) {
342  #ifdef WIN32
343  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
344  #else
345  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
346  #endif
347  if (err<0) {
348  socket_close(sofd);
349  return JBXL_NET_OPTION_ERROR;
350  }
351  }
352 
353  memset(&hints, 0, sizeof(struct addrinfo));
354  hints.ai_family = family;
355  hints.ai_flags = AI_PASSIVE;
356  hints.ai_socktype = SOCK_DGRAM;
357 
358  char* str = itostr_ts(port);
359  err = getaddrinfo(NULL, str, &hints, &address);
360  freeNull(str);
361  if (err!=0) {
362  socket_close(sofd);
363  return JBXL_NET_INFO_ERROR;
364  }
365 
366  err = bind(sofd, address->ai_addr, (int)address->ai_addrlen);
367  if (err<0) {
368  freeaddrinfo(address);
369  socket_close(sofd);
370  return JBXL_NET_BIND_ERROR;
371  }
372 
373  freeaddrinfo(address);
374  return sofd;
375 }

References freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, and socket_close().

Here is the call graph for this function:

◆ _udp_client_socket()

int _udp_client_socket ( char *  hostname,
int  port,
struct addrinfo **  sv_addr,
int  family 
)

int _udp_client_socket(char* hostname, int port, struct addrinfo** sv_addr, int family)

UDPのクライアントソケットを作る. 正常終了した場合, *sv_addrにサーバの情報が格納される.

この関数内で呼び出されるネットワーク関数: socket(), getaddrinfo()

Parameters
hostnameサーバ名
portサーバポート番号
sv_addraddrinfo 構造体へのポインタへのポインタが返る.要 freeaddrinfo(*sv_addr)
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 237 of file network.c.

238 {
239  int sofd, err;
240  struct addrinfo hints;
241 
242  if (sv_addr==NULL) return JBXL_NET_INFO_ERROR;
243  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
244 
245  memset(&hints, 0, sizeof(struct addrinfo));
246  hints.ai_family = family;
247  hints.ai_flags = AI_PASSIVE; // 任意のIPアドレスの接続を許す設定.本来はサーバ用.多分不必要(無視される).
248  hints.ai_socktype = SOCK_DGRAM;
249 
250  char* str = itostr_ts(port);
251  err = getaddrinfo(hostname, str, &hints, sv_addr);
252  freeNull(str);
253  if (err!=0) {
254  *sv_addr = NULL;
255  return JBXL_NET_INFO_ERROR;
256  }
257 
258  sofd = (int)socket((*sv_addr)->ai_family, (*sv_addr)->ai_socktype, (*sv_addr)->ai_protocol);
259  if (sofd<0) {
260  freeaddrinfo(*sv_addr);
261  *sv_addr = NULL;
262  return JBXL_NET_SOCKET_ERROR;
263  }
264 
265  return sofd;
266 }

References freeNull, itostr_ts(), JBXL_NET_INFO_ERROR, and JBXL_NET_SOCKET_ERROR.

Here is the call graph for this function:

◆ _udp_server_socket()

int _udp_server_socket ( int  port,
struct addrinfo **  sv_addr,
int  family 
)

int _udp_server_socket(int port, struct addrinfo** sv_addr, int family)

IPv4/IPv6 の UDPサーバソケットを作り,接続待ち状態になる.

この関数内で呼び出されるネットワーク関数: socket(), bind()

Parameters
portポート番号
sv_addraddrinfo 構造体へのポインタへのポインタが返る.要 freeaddrinfo(*sv_addr)
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 70 of file network.c.

71 {
72  int sofd, err, nullflg = OFF;
73  struct addrinfo hints;
74  struct addrinfo* address;
75  int nonblock = FALSE;
76 
77  if (sv_addr==NULL) {
78  nullflg = ON;
79  sv_addr = &address;
80  }
81  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
82  //
83  if (port<0) {
84  nonblock = TRUE;
85  port = -port;
86  }
87 
88  memset(&hints, 0, sizeof(struct addrinfo));
89  hints.ai_family = family;
90  hints.ai_flags = AI_PASSIVE; // 任意のIPアドレスの接続を許す設定.サーバ用.
91  hints.ai_socktype = SOCK_DGRAM;
92 
93  char* str = itostr_ts(port);
94  err = getaddrinfo(NULL, str, &hints, sv_addr);
95  freeNull(str);
96  if (err!=0) {
97  *sv_addr = NULL;
98  return JBXL_NET_INFO_ERROR;
99  }
100 
101  sofd = (int)socket((*sv_addr)->ai_family, (*sv_addr)->ai_socktype, (*sv_addr)->ai_protocol);
102  if (sofd<0) {
103  freeaddrinfo(*sv_addr);
104  *sv_addr = NULL;
105  return JBXL_NET_SOCKET_ERROR;
106  }
107  if (nonblock) sofd = set_nonblock_socket(sofd);
108 
109  // TIME_WAIT しない設定.
110  int lg = 1;
111  #ifdef WIN32
112  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, (const char*)&lg, sizeof(lg));
113  #else
114  err = setsockopt(sofd, SOL_SOCKET, SO_REUSEADDR, &lg, sizeof(lg));
115  #endif
116  if (err<0) {
117  freeaddrinfo(*sv_addr);
118  socket_close(sofd);
119  return JBXL_NET_OPTION_ERROR;
120  }
121 
122  err = bind(sofd, (*sv_addr)->ai_addr, (int)(*sv_addr)->ai_addrlen);
123  if (err<0) {
124  freeaddrinfo(*sv_addr);
125  *sv_addr = NULL;
126  socket_close(sofd);
127  return JBXL_NET_BIND_ERROR;
128  }
129 
130  if (nullflg) freeaddrinfo(*sv_addr);
131  return sofd;
132 }
#define OFF
Definition: common.h:231
#define ON
Definition: common.h:230

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, OFF, ON, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ _udp_server_socket_setopt()

int _udp_server_socket_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen,
struct addrinfo **  sv_addr,
int  family 
)

int _udp_server_socket_setopt(int port, int opt, const void* optval, int optlen, struct addrinfo** sv_addr, int family)

IPv4/IPv6 の UDPサーバソケットを作り,接続待ち状態になる.オプションの指定(setsockopt)が可能.

この関数内で呼び出されるネットワーク関数: socket(), setsockopt(), bind()

Parameters
portポート番号
optオプションの種類
optvalオプションデータ
optlenoptval の長さ
sv_addraddrinfo 構造体へのポインタへのポインタが返る.要 freeaddrinfo(*sv_addr)
familyプロトコルファミリー(AF_INET/AF_INET6/AF_UNSPEC). AF_UNSPEC の場合は先ずIPv6で接続を試み,不可ならIPv4で接続する.
Return values
0以上作成されたソケット記述子.
JBXL_NET_SOCKET_ERRORソケットが作成できなかった.
JBXL_NET_OPTION_ERRORオプションの設定に失敗.
JBXL_NET_BIND_ERRORバインドに失敗.
JBXL_NET_INFO_ERRORホスト情報の取得に失敗.

Definition at line 156 of file network.c.

157 {
158  int sofd, err, nullflg = OFF;
159  struct addrinfo hints;
160  struct addrinfo* address;
161  int nonblock = FALSE;
162 
163  if (sv_addr==NULL) {
164  nullflg = ON;
165  sv_addr = &address;
166  }
167  if (family!=AF_INET && family!=AF_INET6 && family!=AF_UNSPEC) family = AF_UNSPEC;
168  //
169  if (port<0) {
170  nonblock = TRUE;
171  port = -port;
172  }
173 
174  memset(&hints, 0, sizeof(struct addrinfo));
175  hints.ai_family = family;
176  hints.ai_flags = AI_PASSIVE;
177  hints.ai_socktype = SOCK_DGRAM;
178 
179  char* str = itostr_ts(port);
180  err = getaddrinfo(NULL, str, &hints, sv_addr);
181  freeNull(str);
182  if (err!=0) return JBXL_NET_INFO_ERROR;
183 
184  sofd = (int)socket((*sv_addr)->ai_family, (*sv_addr)->ai_socktype, (*sv_addr)->ai_protocol);
185  if (sofd<0) {
186  freeaddrinfo(*sv_addr);
187  *sv_addr = NULL;
188  return JBXL_NET_SOCKET_ERROR;
189  }
190  if (nonblock) sofd = set_nonblock_socket(sofd);
191 
192  if (opt>0) {
193  #ifdef WIN32
194  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
195  #else
196  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
197  #endif
198  if (err<0) {
199  freeaddrinfo(*sv_addr);
200  *sv_addr = NULL;
201  socket_close(sofd);
202  return JBXL_NET_OPTION_ERROR;
203  }
204  }
205 
206  err = bind(sofd, (*sv_addr)->ai_addr, (int)(*sv_addr)->ai_addrlen);
207  if (err<0) {
208  freeaddrinfo(*sv_addr);
209  *sv_addr = NULL;
210  socket_close(sofd);
211  return JBXL_NET_BIND_ERROR;
212  }
213 
214  if (nullflg) freeaddrinfo(*sv_addr);
215  return sofd;
216 }

References FALSE, freeNull, itostr_ts(), JBXL_NET_BIND_ERROR, JBXL_NET_INFO_ERROR, JBXL_NET_OPTION_ERROR, JBXL_NET_SOCKET_ERROR, OFF, ON, set_nonblock_socket(), socket_close(), and TRUE.

Here is the call graph for this function:

◆ accept_intr()

int accept_intr ( int  sock,
struct sockaddr *  cl_addr,
socklen_t *  cdlen 
)

int accept_intr(int sock, struct sockaddr* cl_addr, socklen_t* cdlen)

accept()でブロック中に割り込みが掛かって,accept()が失敗で終了しても 再施行できるようにするためのラッパー関数 (for Solaris)

Parameters
sockソケット
cl_addrソケットの情報が入る sockaddr 構造体へのポインタ
cdlensockaddr 構造体(*cl_addr)のサイズ
Return values
0以上accept() で作成されたソケット記述子.
-1エラー.

Definition at line 995 of file network.c.

996 {
997  int nsofd = 0;
998 
999  do {
1000  nsofd = (int)accept(sock, cl_addr, cdlen);
1001  } while (nsofd==-1 && errno==EINTR);
1002 
1003  //if (nsofd<0) Error("accept_intr");
1004 
1005  return nsofd;
1006 }

◆ cleanup_network()

void cleanup_network ( void  )

Definition at line 40 of file network.c.

41 {
42 #ifdef WIN32
43  WSACleanup();
44 #endif
45 }

◆ get_hostname_bynum()

char* get_hostname_bynum ( unsigned char *  num,
int  family 
)

char* get_hostname_bynum(unsigned char* num, int family)

IPv4/IPv6 アドレス(バイナリ)からホスト名を逆引きする.

Parameters
numIPv4/IPv6 アドレス(バイナリ)
familyアドレスファミリー(AF_INET/AF_INET6)
Returns
ホスト名(文字列).要 free

Definition at line 1642 of file network.c.

1643 {
1644  int len, err;
1645  char htemp[LNAME];
1646  char* hname = NULL;
1647  struct sockaddr* sa;
1648 
1649  if (num==NULL) return NULL;
1650  if (family!=AF_INET6) family = AF_INET6;
1651 
1652  sa = make_sockaddr_bynum(num, 0, family);
1653  if (sa==NULL) return NULL;
1654 
1655  if (family==AF_INET6) len = sizeof(struct sockaddr_in6);
1656  else len = sizeof(struct sockaddr_in);
1657  err = getnameinfo(sa, len, htemp, LNAME-1, NULL, 0, 0);
1658  if (err!=0) {
1659  free(sa);
1660  return NULL;
1661  }
1662 
1663  len = (int)strlen(htemp);
1664  hname = (char*)malloc(len+1);
1665  if (hname==NULL) {
1666  free(sa);
1667  return NULL;
1668  }
1669 
1670  free(sa);
1671  memcpy(hname, htemp, len+1);
1672  return hname;
1673 }
struct sockaddr * make_sockaddr_bynum(unsigned char *addr, int port, int family)
IPv4/IPv6 対応
Definition: network.c:1556

References len, LNAME, and make_sockaddr_bynum().

Here is the call graph for this function:

◆ get_hostname_bystr()

char* get_hostname_bystr ( const char *  addr)

char* get_hostname_bystr(const char* addr)

IPv4/IPv6 アドレス(文字列)からホスト名を逆引きする.

Parameters
addrIPv4/IPv6 アドレス(文字列)
Returns
ホスト名(文字列).要 free

Definition at line 1684 of file network.c.

1685 {
1686  int len, err;
1687  char htemp[LNAME];
1688  char* hname = NULL;
1689  struct sockaddr* sa;
1690 
1691  if (addr==NULL) return NULL;
1692 
1693  sa = make_sockaddr_bystr(addr, 0);
1694  if (sa==NULL) return NULL;
1695 
1696  if (sa->sa_family==AF_INET6) len = sizeof(struct sockaddr_in6);
1697  else len = sizeof(struct sockaddr_in);
1698  err = getnameinfo(sa, len, htemp, LNAME-1, NULL, 0, 0);
1699  if (err!=0) {
1700  free(sa);
1701  return NULL;
1702  }
1703 
1704  len = (int)strlen(htemp);
1705  hname = (char*)malloc(len+1);
1706  if (hname==NULL) {
1707  free(sa);
1708  return NULL;
1709  }
1710 
1711  free(sa);
1712  memcpy(hname, htemp, len+1);
1713  return hname;
1714 }
struct sockaddr * make_sockaddr_bystr(const char *addr, int port)
IPv4/IPv6 対応
Definition: network.c:1605

References len, LNAME, and make_sockaddr_bystr().

Here is the call graph for this function:

◆ get_ipaddr_byname()

char* get_ipaddr_byname ( const char *  hostname,
int  family 
)

char* get_ipaddr_byname(const char* hostname, int family)

ホスト名から IPv4/IPv6 アドレス(文字列)を獲得する.

Parameters
hostnameホスト名
familyIPのアドレスファミリー AF_INET/AF_INET6
Returns
IPv4/IPv6 アドレス(文字列)へのポインタ.要 free

Definition at line 1781 of file network.c.

1782 {
1783  int len;
1784  char* ip;
1785  unsigned char* ipnum;
1786 
1787  if (family!=AF_INET6) family = AF_INET;
1788 
1789  ipnum = get_ipaddr_byname_num(hostname, family); // 4Byte or 16Byte
1790  if (ipnum==NULL) return NULL;
1791 
1792  if (family==AF_INET6) len = LEN_IPADDR6;
1793  else len = LEN_IPADDR;
1794  ip = (char*)malloc(len);
1795  if (ip==NULL) return NULL;
1796  memset(ip, 0, len);
1797 
1798  inet_ntop(family, ipnum, ip, len);
1799  free(ipnum);
1800  return ip;
1801 }
unsigned char * get_ipaddr_byname_num(const char *hostname, int family)
ホスト名 → IPv4/IPv6 アドレス(バイナリ)
Definition: network.c:1813

References get_ipaddr_byname_num(), len, LEN_IPADDR, and LEN_IPADDR6.

Referenced by check_auth(), and simple_web_proxy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_ipaddr_byname_num()

unsigned char* get_ipaddr_byname_num ( const char *  hostname,
int  family 
)

unsigned char* get_ipaddr_byname_num(const char* hostname, int family)

ホスト名から IPv4/IPv6 アドレス(バイナリ)を獲得する.

Parameters
hostnameホスト名
familyIPのアドレスファミリー AF_INET/AF_INET6
Returns
IPv4/IPv6 アドレス(バイナリ)へのポインタ(長さ 4/16Byte).要 free

Definition at line 1813 of file network.c.

1814 {
1815  int err;
1816  struct addrinfo hints;
1817  struct addrinfo* address;
1818  unsigned char* ip = NULL;
1819  unsigned char* pp = NULL;
1820 
1821  if (family!=AF_INET6) family = AF_INET;
1822 
1823  memset(&hints, 0, sizeof(struct addrinfo));
1824  hints.ai_socktype = SOCK_STREAM;
1825  hints.ai_family = family;
1826 
1827  err = getaddrinfo(hostname, NULL, &hints, &address);
1828  if (err!=0 || address==NULL) return NULL;
1829 
1830  if (family==AF_INET6) { // IPv6
1831  ip = (unsigned char*)malloc(16);
1832  if (ip!=NULL) {
1833  //pp = (unsigned char*)(((struct sockaddr_in6*)(address->ai_addr))->sin6_addr.s6_addr); // unsigned char s6_addr[16];
1834  pp = (unsigned char*)&(((struct sockaddr_in6*)(address->ai_addr))->sin6_addr); // unsigned char s6_addr[16];
1835  memcpy(ip, pp, 16);
1836  }
1837  }
1838  //
1839  if (pp==NULL) { // IPv4
1840  ip = (unsigned char*)malloc(4);
1841  if (ip!=NULL) {
1842  //pp = (unsigned char*)(&((struct sockaddr_in*)(address->ai_addr))->sin_addr.s_addr); // ulong s_addr;
1843  pp = (unsigned char*)&(((struct sockaddr_in*)(address->ai_addr))->sin_addr); // ulong s_addr;
1844  memcpy(ip, pp, 4);
1845  }
1846  }
1847 
1848  freeaddrinfo(address);
1849  return ip;
1850 }

Referenced by get_ipaddr_byname(), and to_address_num().

Here is the caller graph for this function:

◆ get_ipaddr_ipv4()

char* get_ipaddr_ipv4 ( struct in_addr  sin_addr)

char* get_ipaddr_ipv4(struct in_addr sin_addr)

in_addr構造体から IPアドレスを獲得する.

Parameters
sin_addrsockaddr_in 構造体の sin_addr メンバ.
Returns
IPアドレス(文字列)へのポインタ.要 free
struct sockaddr_in addr
.........;
ipaddr = get_ipaddr_ipv4(addr.sin_addr);
char * get_ipaddr_ipv4(struct in_addr sin_addr)
構造体 → IPv4 アドレス(文字列) use get_ipaddr_byname()
Definition: network.c:2685

Definition at line 2685 of file network.c.

2686 {
2687  char* ip;
2688  unsigned char* pp;
2689 
2690  pp = (unsigned char*)&(sin_addr);
2691  if (pp[0]==0) return NULL;
2692 
2693  ip = (char*)malloc(16);
2694  if (ip==NULL) return NULL;
2695  memset(ip, 0, 16);
2696 
2697  snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
2698 
2699  return ip;
2700 }

◆ get_ipaddr_num_ipv4()

unsigned char* get_ipaddr_num_ipv4 ( struct in_addr  sin_addr)

unsigned char* get_ipaddr_num_ipv4(struct in_addr sin_addr)

in_addr 構造体から IPアドレスを獲得する.

Parameters
sin_addrsockaddr_in 構造体の sin_addr メンバ.
Returns
IPアドレス(バイナリ)へのポインタ(長さ4byte).要 free
struct sockaddr_in addr
.........;
ipaddr = get_ipaddr_num(addr.sin_addr);
unsigned char * get_ipaddr_num(struct in_addr sin_addr)
構造体  → IPv4アドレス(数字4byte)
Definition: network4.c:1310

Definition at line 2717 of file network.c.

2718 {
2719  unsigned char* ip;
2720  unsigned char* pp;
2721 
2722  ip = (unsigned char*)malloc(4);
2723  if (ip==NULL) return NULL;
2724 
2725  pp = (unsigned char*)&(sin_addr);
2726  memcpy(ip, pp, 4);
2727 
2728  return ip;
2729 }

◆ get_local_sockaddr_in()

struct sockaddr_in get_local_sockaddr_in ( unsigned short  cport)

Definition at line 2605 of file network.c.

2655 {
2656  struct sockaddr_in ss_addr;
2657  struct hostent *shost;
2658 
2659  // localhost の情報を ss_addrに格納
2660  shost = gethostbyname("127.0.0.1");
2661 
2662  memset(&ss_addr, 0, sizeof(ss_addr));
2663  ss_addr.sin_family = AF_INET;
2664  ss_addr.sin_port = htons(cport);
2665  memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
2666 
2667  return ss_addr;
2668 }

References JBXL_NET_RECV_TIMEOUT, recv_wait(), and udp_recv_sockaddr_in().

Here is the call graph for this function:

◆ get_myipaddr()

char* get_myipaddr ( int  family)

Definition at line 1935 of file network.c.

1936 {
1937  int err, flg, len, lst;
1938  struct ifaddrs *if_addr;
1939  struct ifaddrs *ifap;
1940 
1941  char htemp[LNAME];
1942  char* haddr = NULL;
1943 
1944  if (family!=AF_INET6) {
1945  family = AF_INET;
1946  len = sizeof(struct sockaddr_in);
1947  }
1948  else {
1949  len = sizeof(struct sockaddr_in6);
1950  }
1951  //
1952  err = getifaddrs(&if_addr);
1953  if (err<0) return NULL;
1954 
1955  flg = OFF;
1956  ifap = if_addr;
1957  while(ifap!=NULL) {
1958  if (ifap->ifa_addr!=NULL && family==ifap->ifa_addr->sa_family) {
1959  memset(htemp, 0, LNAME);
1960  err = getnameinfo(ifap->ifa_addr, len, htemp, LNAME, NULL, 0, NI_NUMERICHOST);
1961  if (err==0) {
1962  if (family==AF_INET) {
1963  if (strncmp(htemp, "127.0.0.1", 9) && strncmp(htemp, "169.254.", 8)) {
1964  struct sockaddr_in* sa = (struct sockaddr_in*)(ifap->ifa_addr);
1965  unsigned char check = ((unsigned char*)&(sa->sin_addr))[0] & 0xf0;
1966  if (check != 0xe) { // not multi cast
1967  flg = ON;
1968  break;
1969  }
1970  }
1971  }
1972  else {
1973  if (strncmp(htemp, "::1", 3) && strncasecmp(htemp, "fe80:", 5)) {
1974  flg = ON;
1975  break;
1976  }
1977  }
1978  }
1979  }
1980  ifap=ifap->ifa_next;
1981  }
1982  if (flg==OFF) {
1983  freeifaddrs(if_addr);
1984  return NULL;
1985  }
1986 
1987  freeifaddrs(if_addr);
1988 
1989  lst = strlen(htemp);
1990  if (LNAME-lst-1<=0) return NULL;
1991  htemp[lst++] = '/';
1992 
1993  err = getnameinfo(ifap->ifa_netmask, len, &(htemp[lst]), LNAME-lst, NULL, 0, NI_NUMERICHOST);
1994  if (err!=0) return NULL;
1995 
1996  len = strlen(htemp) + 1;
1997  haddr = (char*)malloc(len);
1998  if (haddr==NULL) return NULL;
1999  memset(haddr, 0, len);
2000  memcpy(haddr, htemp, len-1);
2001 
2002  return haddr;
2003 }

References len, LNAME, OFF, and ON.

Referenced by get_myipaddr_num().

Here is the caller graph for this function:

◆ get_myipaddr_num()

unsigned char* get_myipaddr_num ( int  family)

Definition at line 2008 of file network.c.

2009 {
2010  int len, err;
2011  char* pos;
2012  char* htemp;
2013  unsigned char* haddr = NULL;
2014 
2015  if (family!=AF_INET6) family = AF_INET;
2016 
2017  //
2018  htemp = get_myipaddr(family);
2019  if (htemp==NULL) return NULL;
2020 
2021  pos = strstr(htemp, "/");
2022  if (pos==NULL) {
2023  free(htemp);
2024  return NULL;
2025  }
2026  *pos = '\0';
2027 
2028  if (family==AF_INET6) len = 16;
2029  else len = 4;
2030  haddr = (unsigned char*)malloc(len*2);
2031  if (haddr==NULL) {
2032  free(htemp);
2033  return NULL;
2034  }
2035  memset(haddr, 0, len*2);
2036 
2037  err = inet_pton(family, htemp, haddr);
2038  if (err!=1) {
2039  free(haddr);
2040  return NULL;
2041  }
2042 
2043  err = inet_pton(family, pos+1, haddr+len);
2044  free(htemp);
2045  if (err!=1) {
2046  free(haddr);
2047  return NULL;
2048  }
2049 
2050  return haddr;
2051 }
char * get_myipaddr(int family)
自分の [IPv4/IPv6 ネットワークアドレス]/[ネットマスク](文字列)
Definition: network.c:1935

References get_myipaddr(), and len.

Referenced by get_mynetaddr_num().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_mynetaddr()

char* get_mynetaddr ( int  family)

char* get_mynetaddr(int family)

自分のネットワークアドレスを返す

Parameters
familyプロトコルファミリー(AF_INET/AF_INET6)
Returns
ネットワークアドレス(文字列)へのポインタ.要 free

Definition at line 2142 of file network.c.

2143 {
2144  int len;
2145  char* net;
2146  unsigned char* pp;
2147 
2148  len = LEN_IPADDR6;
2149  if (family!=AF_INET6) {
2150  len = LEN_IPADDR;
2151  family = AF_INET;
2152  }
2153 
2154  pp = get_mynetaddr_num(family);
2155  if (pp==NULL) return NULL;
2156 
2157  net = (char*)malloc(len);
2158  if (net==NULL) {
2159  free(pp);
2160  return NULL;
2161  }
2162  memset(net, 0, len);
2163 
2164  inet_ntop(family, pp, net, len);
2165  free(pp);
2166  return net;
2167 }
unsigned char * get_mynetaddr_num(int family)
自分の IPv4/IPv6 ネットワークアドレス(バイナリ)
Definition: network.c:2177

References get_mynetaddr_num(), len, LEN_IPADDR, and LEN_IPADDR6.

Here is the call graph for this function:

◆ get_mynetaddr_num()

unsigned char* get_mynetaddr_num ( int  family)

unsigned char* get_mynetaddr_num(int family)

自分のネットワークアドレスを返す

Returns
ネットワークアドレス(バイナリ)へのポインタ(長さ4byte).要 free

Definition at line 2177 of file network.c.

2178 {
2179  int i, len;
2180  unsigned char* net;
2181  unsigned char* ip;
2182  unsigned char* mk;
2183 
2184  len = 16;
2185  if (family!=AF_INET6) len = 4;
2186 
2187  ip = get_myipaddr_num(family);
2188  if (ip==NULL) return NULL;
2189  mk = &(ip[len]);
2190 
2191  net = (unsigned char*)malloc(len);
2192  if (net==NULL) {
2193  free(ip);
2194  return NULL;
2195  }
2196  for (i=0; i<len; i++) net[i] = ip[i] & mk[i];
2197 
2198  free(ip);
2199  return net;
2200 }
unsigned char * get_myipaddr_num(int family)
自分の [IPv4/IPv6 アドレス],[ネットマスク](バイナリ)
Definition: network.c:2008

References get_myipaddr_num(), and len.

Referenced by get_mynetaddr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_sockaddr_in()

struct sockaddr_in get_sockaddr_in ( char *  hostname,
unsigned short  cport 
)

Definition at line 2605 of file network.c.

2620 {
2621  struct sockaddr_in ss_addr;
2622  struct hostent *shost;
2623 
2624  // Serverの情報を ss_addrに格納
2625  shost = gethostbyname(hostname);
2626  if (shost==NULL) {
2627  ss_addr.sin_family = 0;
2628  ss_addr.sin_port = 0;
2629  return ss_addr;
2630  }
2631 
2632  memset(&ss_addr, 0, sizeof(ss_addr));
2633  ss_addr.sin_family = AF_INET;
2634  ss_addr.sin_port = htons(cport);
2635  memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
2636 
2637  return ss_addr;
2638 }

◆ get_sockaddr_in_bynum()

struct sockaddr_in get_sockaddr_in_bynum ( char *  ipnum,
unsigned short  cport 
)

Definition at line 2605 of file network.c.

2642 {
2643  struct sockaddr_in ss_addr;
2644 
2645  memset(&ss_addr, 0, sizeof(ss_addr));
2646  ss_addr.sin_family = AF_INET;
2647  ss_addr.sin_port = htons(cport);
2648  memcpy(&(ss_addr.sin_addr), ipnum, 4);
2649 
2650  return ss_addr;
2651 }

◆ get_valid_tcp_client_socket()

int get_valid_tcp_client_socket ( int  min,
int  max,
char *  hname,
unsigned short  sport,
unsigned short *  cport 
)

Definition at line 1124 of file network.c.

1125 {
1126  int i, sock, range;
1127 
1128  range = max - min + 1;
1129  *cport = rand()%range + min;
1130 
1131  i = 1;
1132  sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
1133  while(sock<0 && i<range) {
1134  (*cport)++;
1135  if (*cport>max) *cport = ((int)*cport)%max + min - 1;
1136  sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
1137  i++;
1138  }
1139 
1140  if (sock<=0) *cport = 0;
1141 
1142  return sock;
1143 }
#define tcp_client_bind_socket(h, s, c)
Definition: network.h:134

References tcp_client_bind_socket.

◆ get_valid_tcp_server_socket()

int get_valid_tcp_server_socket ( int  min,
int  max,
unsigned short *  port 
)

Definition at line 1102 of file network.c.

1103 {
1104  int i, sock, range;
1105 
1106  range = max - min + 1;
1107  *port = rand()%range + min;
1108 
1109  i = 1;
1110  sock = tcp_server_socket((int)*port);
1111  while(sock<=0 && i<range) {
1112  (*port)++;
1113  if (*port>max) *port = ((int)*port)%max + min - 1;
1114  sock = tcp_server_socket((int)*port);
1115  i++;
1116  }
1117 
1118  if (sock<=0) *port = 0;
1119 
1120  return sock;
1121 }
#define tcp_server_socket(p)
Definition: network.h:108

References tcp_server_socket.

◆ get_valid_udp_socket()

int get_valid_udp_socket ( int  min,
int  max,
unsigned short *  port 
)

Definition at line 1078 of file network.c.

1079 {
1080  int i, sock, range;
1081  struct addrinfo* address;
1082 
1083  range = max - min + 1;
1084  *port = rand()%range + min;
1085 
1086  i = 1;
1087  sock = udp_server_socket((int)*port, &address);
1088  while(sock<=0 && i<range) {
1089  (*port)++;
1090  if (*port>max) *port = ((int)*port)%max + min - 1;
1091  sock = udp_server_socket((int)*port, &address);
1092  i++;
1093  }
1094 
1095  if (sock<=0) *port = 0;
1096 
1097  freeaddrinfo(address);
1098  return sock;
1099 }
#define udp_server_socket(p, a)
Definition: network.h:82

References udp_server_socket.

◆ init_network()

int init_network ( void  )

Definition at line 26 of file network.c.

27 {
28  int ret = 0;
29 
30 #ifdef WIN32
31  // for 10093 エラー
32  ret = WSAStartup(MAKEWORD(2,0), &WsaData);
33  if (ret!=0) WSACleanup();
34 #endif
35 
36  return ret;
37 }

◆ is_same_network()

int is_same_network ( char *  addr1,
char *  addr2,
char *  mask 
)

int is_same_network(char* addr1, char* addr2, char* mask)

文字型アドレス addr1 と addr2が同じネットワークに属しているかどうかチェックする.
addr1, addr2 は FQDNでも可.

Parameters
addr1比較するアドレス(文字型).FQDN は不可
addr2比較するアドレス(文字型).FQDN は不可
maskネットマスク(文字型)
Return values
TRUE同じネットワークである.
FALSE同じネットワークでない.

Definition at line 2283 of file network.c.

2284 {
2285  int ret, family;
2286  unsigned char* a1;
2287  unsigned char* a2;
2288  unsigned char* mk;
2289 
2290  if (addr1==NULL || addr2==NULL || mask==NULL) return FALSE;
2291 
2292  a1 = (unsigned char*)strstr(addr1, ":");
2293  a2 = (unsigned char*)strstr(addr1, ":");
2294  mk = (unsigned char*)strstr(mask, ":");
2295  if (a1!=NULL && a2!=NULL && mask!=NULL) family = AF_INET6;
2296  else if (a1==NULL && a2==NULL && mask==NULL) family = AF_INET;
2297  else return FALSE;
2298 
2299  a1 = to_address_num(addr1, 0, 0, family);
2300  a2 = to_address_num(addr2, 0, 0, family);
2301  mk = to_address_num(mask, 0, 0, family);
2302  if (a1==NULL || a2==NULL || mk==NULL) {
2303  freeNull(a1);
2304  freeNull(a2);
2305  freeNull(mk);
2306  return FALSE;
2307  }
2308 
2309  ret = is_same_network_num(a1, a2, mk, family);
2310  freeNull(a1);
2311  freeNull(a2);
2312  freeNull(mk);
2313 
2314  return ret;
2315 }
int is_same_network_num(unsigned char *addr1, unsigned char *addr2, unsigned char *mask, int family)
Definition: network.c:2331
unsigned char * to_address_num(char *addr, int mode, int mask, int family)
IPv4/IPv6 アドレス(文字列)→ [IPv4/IPv6 アドレス],[ネットマスク](数字8/32Byte)
Definition: network.c:2373

References FALSE, freeNull, is_same_network_num(), and to_address_num().

Here is the call graph for this function:

◆ is_same_network_num()

int is_same_network_num ( unsigned char *  addr1,
unsigned char *  addr2,
unsigned char *  mask,
int  family 
)

int is_same_network_num(unsigned char* addr1, unsigned char* addr2, unsigned char* mask, int family)

数字型アドレス addr1 と addr2が同じネットワークに属しているかどうかチェックする.

Parameters
addr1比較するアドレス(数字型)4/16Byte
addr2比較するアドレス(数字型)4/16Byte
maskネットマスク(数字型)4/16Byte
familyアドレスファミリー (AF_INET/AF_INET6)
Return values
TRUE同じネットワークである.
FALSE同じネットワークでない

Definition at line 2331 of file network.c.

2332 {
2333  int i, len;
2334 
2335  if (addr1==NULL || addr2==NULL) return FALSE;
2336 
2337  len = 16;
2338  if (family!=AF_INET6) len = 4;
2339 
2340  if (mask==NULL) {
2341  for (i=0; i<len; i++) {
2342  if (addr1[i] != addr2[i]) return FALSE;
2343  }
2344  }
2345  else {
2346  for (i=0; i<len; i++) {
2347  if ((addr1[i] & mask[i]) != (addr2[i] & mask[i])) return FALSE;
2348  }
2349  }
2350  return TRUE;
2351 }

References FALSE, len, and TRUE.

Referenced by is_same_network().

Here is the caller graph for this function:

◆ is_same_sockaddr()

int is_same_sockaddr ( struct sockaddr *  addr1,
struct sockaddr *  addr2 
)

int is_same_sockaddr(struct sockaddr* addr1, struct sockaddr* addr2)

addr1 と addr2が格納する IPアドレスとポート番号が同じかどうか検査する

Parameters
addr1比較する sockaddr 構造体へのポインタ
addr2比較する sockaddr 構造体へのポインタ
Return values
TRUE同じホスト
FALSE違うホスト

Definition at line 2219 of file network.c.

2220 {
2221  int i, len;
2222  unsigned char *p1, *p2;
2223  struct sockaddr_in *sa1, *sa2;
2224  struct sockaddr_in6 *sa61, *sa62;
2225 
2226  if (addr1==NULL || addr2==NULL) return FALSE;
2227  if (addr1->sa_family!=addr2->sa_family) return FALSE;
2228 
2229  if (addr1->sa_family==AF_INET) {
2230  sa1 = (struct sockaddr_in*)addr1;
2231  sa2 = (struct sockaddr_in*)addr2;
2232 
2233  p1 = (unsigned char*)&(sa1->sin_addr);
2234  p2 = (unsigned char*)&(sa2->sin_addr);
2235  len = sizeof(sa1->sin_addr);
2236  for (i=0; i<len; i++) {
2237  if (p1[i]!=p2[i]) return FALSE;
2238  }
2239 
2240  p1 = (unsigned char*)&(sa1->sin_port);
2241  p2 = (unsigned char*)&(sa2->sin_port);
2242  len = sizeof(sa1->sin_port);
2243  for (i=0; i<len; i++) {
2244  if (p1[i]!=p2[i]) return FALSE;
2245  }
2246  }
2247  else {
2248  sa61 = (struct sockaddr_in6*)addr1;
2249  sa62 = (struct sockaddr_in6*)addr2;
2250 
2251  p1 = (unsigned char*)&(sa61->sin6_addr);
2252  p2 = (unsigned char*)&(sa62->sin6_addr);
2253  len = sizeof(sa61->sin6_addr);
2254  for (i=0; i<len; i++) {
2255  if (p1[i]!=p2[i]) return FALSE;
2256  }
2257 
2258  p1 = (unsigned char*)&(sa61->sin6_port);
2259  p2 = (unsigned char*)&(sa62->sin6_port);
2260  len = sizeof(sa61->sin6_port);
2261  for (i=0; i<len; i++) {
2262  if (p1[i]!=p2[i]) return FALSE;
2263  }
2264  }
2265 
2266  return TRUE;
2267 }

References FALSE, len, and TRUE.

◆ make_sockaddr_bynum()

struct sockaddr* make_sockaddr_bynum ( unsigned char *  addr,
int  port,
int  family 
)

struct sockaddr* make_sockaddr_bynum(unsigned char* addr, int port, int family)

バイナリの IPv4/IPv6 アドレスとポート番号から 有効な struct sockaddr を作り出す

Parameters
addrバイナリのIPアドレス(IPv4/IPv6)
portポート番号
familyプロトコルファミリー(AF_INET/AF_INET6)
Returns
sa struct sockaddr へのポインタ.要 free

Definition at line 1556 of file network.c.

1557 {
1558  struct sockaddr* sa = NULL;
1559  int len;
1560 
1561  len = sizeof(struct sockaddr);
1562  sa = (struct sockaddr*)malloc(len);
1563  if (sa==NULL) return NULL;
1564  memset(sa, 0, len);
1565 
1566  if (family==AF_INET6) { // IPv6
1567  struct sockaddr_in6* sa6;
1568  len = sizeof(struct sockaddr_in6);
1569  sa6 = (struct sockaddr_in6*)malloc(len);
1570  memset(sa6, 0, len);
1571  //
1572  sa6->sin6_family = AF_INET6;
1573  sa6->sin6_port = htons(port);
1574  //memcpy(sa6->sin6_addr.s6_addr, addr, 16);
1575  memcpy(&(sa6->sin6_addr), addr, 16);
1576  sa = (struct sockaddr*)sa6;
1577  }
1578  //
1579  else { // IPv4
1580  struct sockaddr_in* sa4;
1581  len = sizeof(struct sockaddr_in);
1582  sa4 = (struct sockaddr_in*)malloc(len);
1583  memset(sa4, 0, len);
1584  //
1585  sa4->sin_family = AF_INET;
1586  sa4->sin_port = htons(port);
1587  //memcpy(&(sa4->sin_addr.s_addr), addr, 4);
1588  memcpy(&(sa4->sin_addr), addr, 4);
1589  sa = (struct sockaddr*)sa4;
1590  }
1591 
1592  return sa;
1593 }

References len.

Referenced by get_hostname_bynum(), and make_sockaddr_bystr().

Here is the caller graph for this function:

◆ make_sockaddr_bystr()

struct sockaddr* make_sockaddr_bystr ( const char *  addr,
int  port 
)

struct sockaddr* make_sockaddr_bystr(const char* addr, int port)

文字列の IPv4/IPv6 アドレスとポート番号から 有効な struct sockaddr を作り出す

Parameters
addr文字列のIPアドレス(IPv4/IPv6)
portポート番号
Returns
sa struct sockaddr へのポインタ.要 free

Definition at line 1605 of file network.c.

1606 {
1607  int err, family = -1;
1608  char* pp;
1609  unsigned char num[16];
1610  struct sockaddr* sa;
1611 
1612  pp = strstr((char*)addr, ".");
1613  if (pp!=NULL) {
1614  family = AF_INET;
1615  }
1616  else {
1617  pp = strstr((char*)addr, ":");
1618  if (pp!=NULL) {
1619  family = AF_INET6;
1620  }
1621  }
1622  if (family<0) return NULL;
1623 
1624  memset(num, 0, 16);
1625  err = inet_pton(family, addr, num);
1626  if (err!=1) return NULL;
1627 
1628  sa = make_sockaddr_bynum(num, port, family);
1629  return sa;
1630 }

References make_sockaddr_bynum().

Referenced by get_hostname_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ recv_wait()

int recv_wait ( int  sock,
int  tm 
)

int recv_wait(int sock, int tm)

簡易 受信 wait. ソケットにデータが受信されるまで待つ.スレッド対応

Parameters
sock監視するソケット
tmタイムアウトの秒数
Return values
TRUEバッファにデータがある.
FALSEタイムアウトした.

Definition at line 1443 of file network.c.

1444 {
1445  int nd;
1446  fd_set mask;
1447  struct timeval timeout;
1448  time_t otm, ntm;
1449 
1450  otm = time(NULL);
1451  do {
1452  timeout.tv_sec = tm;
1453  timeout.tv_usec = 0;
1454  FD_ZERO(&mask);
1455  FD_SET(sock, &mask);
1456 
1457  //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
1458  nd = select(sock+1, &mask, NULL, NULL, &timeout);
1459  ntm = time(NULL);
1460  } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
1461 
1462  return FD_ISSET(sock, &mask);
1463 }

Referenced by get_local_sockaddr_in(), recv_http_closed(), ssl_recv_wait(), ssl_tcp_recv_wait(), tcp_recv_wait(), udp_recv_wait(), and www2browser_relay().

Here is the caller graph for this function:

◆ recv_wait_twin()

int recv_wait_twin ( int  sock1,
int  sock2,
int  tm 
)

int recv_wait_twin(int sock1, int sock2, int tm)

簡易 受信 wait. 二つのソケット sock1, sock2 にデータが受信されるまで待つ.スレッド対応

Parameters
sock1監視するソケット その1
sock2監視するソケット その2
tmタイムアウトの秒数
Return values
0タイムアウトした.
1sock1 のバッファにデータがある.
2sock2 のバッファにデータがある.
3sock1 と sock2 のバッファにデータがある.

Definition at line 1480 of file network.c.

1481 {
1482  int ret = 0;
1483  int nm, nd;
1484  fd_set mask;
1485  struct timeval timeout;
1486  time_t otm, ntm;
1487 
1488  nm = Max(sock1, sock2);
1489  otm = time(NULL);
1490  do {
1491  timeout.tv_sec = tm;
1492  timeout.tv_usec = 0;
1493  FD_ZERO(&mask);
1494  FD_SET(sock1, &mask);
1495  FD_SET(sock2, &mask);
1496  nd = select(nm+1, &mask, NULL, NULL, &timeout);
1497  ntm = time(NULL);
1498  } while ((nd<0 || (!FD_ISSET(sock1, &mask) && !FD_ISSET(sock2, &mask))) && (int)(ntm-otm)<=tm);
1499 
1500  if (FD_ISSET(sock1, &mask)) ret += 1;
1501  if (FD_ISSET(sock2, &mask)) ret += 2;
1502 
1503  return ret;
1504 }
#define Max(x, y)
Definition: common.h:247

References Max.

◆ send_wait()

int send_wait ( int  sock,
int  tm 
)

int send_wait(int sock, int tm)

簡易 送信 wait. データが送信可能になるまで待つ.スレッド対応

Parameters
sock監視するソケット
tmタイムアウトの秒数
Return values
TRUEバッファにデータがある.
FALSEタイムアウトした.

Definition at line 1518 of file network.c.

1519 {
1520  int nd;
1521  fd_set mask;
1522  struct timeval timeout;
1523  time_t otm, ntm;
1524 
1525  otm = time(NULL);
1526  do {
1527  timeout.tv_sec = tm;
1528  timeout.tv_usec = 0;
1529  FD_ZERO(&mask);
1530  FD_SET(sock, &mask);
1531 
1532  //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
1533  nd = select(sock+1, NULL, &mask, NULL, &timeout);
1534  ntm = time(NULL);
1535  } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
1536 
1537  return FD_ISSET(sock, &mask);
1538 }

◆ set_block_socket()

int set_block_socket ( int  sock)

int set_block_socket(int sock)

Definition at line 1060 of file network.c.

1061 {
1062 #ifdef WIN32
1063  u_long val = 0;
1064  ioctlsocket(sock, FIONBIO, &val);
1065 #else
1066  int val = fcntl(sock, F_GETFL, 0);
1067  if (val>=0) fcntl(sock, F_SETFL, val & ~O_NONBLOCK);
1068 #endif
1069  return sock;
1070 }

◆ set_nonblock_socket()

int set_nonblock_socket ( int  sock)

int set_nonblock_socket(int sock)

Definition at line 1043 of file network.c.

1044 {
1045 #ifdef WIN32
1046  u_long val = 1;
1047  ioctlsocket(sock, FIONBIO, &val);
1048 #else
1049  int val = fcntl(sock, F_GETFL, 0);
1050  if (val>=0) fcntl(sock, F_SETFL, val | O_NONBLOCK);
1051 #endif
1052  return sock;
1053 }

Referenced by _tcp_server_bind(), _tcp_server_bind_setopt(), _tcp_server_socket(), _tcp_server_socket_setopt(), _udp_server_socket(), and _udp_server_socket_setopt().

Here is the caller graph for this function:

◆ socket_close()

int socket_close ( int  sofd)

int socket_close(int sofd)

未送信のデータを破棄して,ソケットを完全に閉じる.

Attention
fork() した場合,親プロセスで socket_close()すると,子プロセスのソケットにも影響を及ぼす.
Parameters
sofdクローズしたいソケット記述子を指定.
Return values
1以上最後に受信したバイト数
0正常切断.
-1エラー

Definition at line 1022 of file network.c.

1023 {
1024  int err = -1;
1025 
1026  if (sofd>0) {
1027  #ifdef WIN32
1028  err = shutdown(sofd, 2);
1029  closesocket(sofd);
1030  #else
1031  err = shutdown(sofd, SHUT_RDWR);
1032  close(sofd);
1033  #endif
1034  }
1035  return err;
1036 }

Referenced by _get_localip_bydest(), _tcp_bind(), _tcp_bind_setopt(), _tcp_client_bind_socket(), _tcp_client_socket(), _tcp_connect(), _tcp_server_bind(), _tcp_server_bind_setopt(), _tcp_server_socket(), _tcp_server_socket_setopt(), _udp_bind(), _udp_bind_setopt(), _udp_server_socket(), _udp_server_socket_setopt(), check_auth(), get_valid_rtp_pair_sockets(), simple_web_proxy(), and udp_client_socket_sockaddr_in().

Here is the caller graph for this function:

◆ tcp_recv()

int tcp_recv ( int  sock,
char *  rmsg,
int  size 
)

int tcp_recv(int sock, char* rmsg, int size)

recv()をラッピングした関数.TCP経由でデータを受信する.

Parameters
sockソケット記述子
rmsg受信用データバッファ.関数内で初期化される.
sizeデータバッファのサイズ
Return values
1以上受信したバイト数.
0正常切断.
JBXL_NET_RECV_ERROR失敗

Definition at line 1226 of file network.c.

1227 {
1228  int cc;
1229 
1230  memset(rmsg, 0, size);
1231  cc = recv(sock, rmsg, size, 0);
1232 
1233  if (cc<0) cc = JBXL_NET_RECV_ERROR;
1234  return cc;
1235 }
#define JBXL_NET_RECV_ERROR
データの受信エラー
Definition: jbxl_state.h:70

References JBXL_NET_RECV_ERROR.

◆ tcp_recv_mstream()

int tcp_recv_mstream ( int  sock,
char *  mesg,
int  sz,
mstream sb,
int  tm 
)

int tcp_recv_mstream(int sock, char* mesg, int sz, mstream* sb, int tm)

TCP経由でメッセージ(文字列)を受信する.受信メッセージはメッセージストリームバッファに一旦バッファリングされ, この関数により一行ずつ読み出される.mesgには最大 sz-1文字が格納される. もし,バッファ中の一行のデータが sz-1より大きい場合は,はみ出した部分は捨てられる.

mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る. タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される. 一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない. そうで無い場合は受信データの整合性は保証されない.

Parameters
sockソケット記述子
mesg受信用データバッファ.予め十分なメモリ領域を確保しておく.
szデータバッファのサイズ
sbリングバッファ型のストリームバッファ. バッファ部が確保されていなければ,自動的に確保される.
tmタイムアウト時間.秒単位.
Return values
1以上mesgに格納したメッセージのバイト数.
0おそらくは相手側がセッションをクローズした.
JBXL_NET_RECV_ERROR受信エラー.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_MALLOC_ERRORメッセージバッファ部が無いので確保しようとしたが,確保に失敗した.
JBXL_NET_BUF_ERRORメッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した.
JBXL_NET_BUFSZ_ERRORメッセージバッファ中のデータの長さが,mesgの長さより大きい.はみ出した部分は捨てられた.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 1395 of file network.c.

1396 {
1397  int cc;
1398  unsigned char* pp;
1399 
1400  if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
1401  //memset(mesg, 0, sz);
1402 
1403  if (sb->buf==NULL) {
1404  *sb = make_mstream(RECVBUFSZ);
1405  if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
1406  }
1407 
1408  while (sb->datano==0) {
1409  cc = tcp_recv_wait(sock, mesg, sz, tm);
1410  if (cc<=0) {
1411  if (cc<0) cc = JBXL_NET_RECV_ERROR;
1412  return cc;
1413  }
1414  put_mstream(sb, (unsigned char*)mesg);
1415  //memset(mesg, 0, sz);
1416  }
1417 
1418  pp = get_mstream(sb);
1419  if (pp==NULL) return JBXL_NET_BUF_ERROR;
1420  if (strlen((const char*)pp)>=(unsigned int)sz) {
1421  memcpy(mesg, pp, sz-1);
1422  free(pp);
1423  return JBXL_NET_BUFSZ_ERROR;
1424  }
1425  memcpy(mesg, pp, strlen((const char*)pp));
1426 
1427  free(pp);
1428  return (int)strlen(mesg);
1429 }
#define RECVBUFSZ
256K
Definition: common.h:134
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition: jbxl_state.h:42
#define JBXL_NET_BUFSZ_ERROR
受信バッファの長さが足りない.はみ出したデータは捨てられた
Definition: jbxl_state.h:73
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition: jbxl_state.h:41
#define JBXL_NET_BUF_ERROR
受信バッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した
Definition: jbxl_state.h:72
int tcp_recv_wait(int sock, char *mesg, int sz, int tm)
Definition: network.c:1317
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition: tools.c:3491
unsigned char * get_mstream(mstream *sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
Definition: tools.c:3532
#define make_mstream(s)
make_ringBuffer()
Definition: tools.h:385

References get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, JBXL_NET_BUFSZ_ERROR, JBXL_NET_RECV_ERROR, make_mstream, put_mstream(), RECVBUFSZ, and tcp_recv_wait().

Here is the call graph for this function:

◆ tcp_recv_wait()

int tcp_recv_wait ( int  sock,
char *  mesg,
int  sz,
int  tm 
)

int tcp_recv_wait(int sock, char* mesg, int sz, int tm)

TCP経由でデータを受信する.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters
sockソケット記述子
mesg受信用データバッファ.関数内で初期化される.
szデータバッファのサイズ
tmタイムアウト時間.秒単位.
Return values
1以上受信したバイト数.
0おそらくは相手側がセッションをクローズした.
JBXL_NET_RECV_ERROR受信エラー.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 1317 of file network.c.

1318 {
1319  int cc;
1320 
1321  memset(mesg, 0, sz);
1322  if (recv_wait(sock, tm)) {
1323  cc = recv(sock, mesg, sz, 0);
1324  }
1325  else {
1326  return JBXL_NET_RECV_TIMEOUT;
1327  }
1328 
1329  if (cc<0) cc = JBXL_NET_RECV_ERROR;
1330  return cc;
1331 }
#define JBXL_NET_RECV_TIMEOUT
受信タイムアウト
Definition: jbxl_state.h:76
int recv_wait(int sock, int tm)
Definition: network.c:1443

References JBXL_NET_RECV_ERROR, JBXL_NET_RECV_TIMEOUT, and recv_wait().

Referenced by tcp_recv_Buffer_wait(), and tcp_recv_mstream().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tcp_send()

int tcp_send ( int  sock,
char *  smsg,
int  size 
)

int tcp_send(int sock, char* smsg, int size)

send()をラッピングした関数.TCP経由でデータを送る.

データ(smsg)のサイズ sizeに0以下を指定した場合は,smsgは文字列であると見なして,サイズを自動的に計算する.

Parameters
sockソケット記述子
smsg送信するデータ
size送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす.
Return values
0以上送信したバイト数.
JBXL_NET_SEND_ERROR失敗

Definition at line 1252 of file network.c.

1253 {
1254  int cc;
1255 
1256  if (size<=0) size = (int)strlen(smsg);
1257  cc = send(sock, smsg, size, 0);
1258 
1259  if (cc<0) cc = JBXL_NET_SEND_ERROR;
1260  return cc;
1261 }
#define JBXL_NET_SEND_ERROR
データの送信エラー
Definition: jbxl_state.h:71

References JBXL_NET_SEND_ERROR.

Referenced by send_http_passwd_req(), send_http_res_file(), and simple_web_proxy().

Here is the caller graph for this function:

◆ tcp_send_mesgln()

int tcp_send_mesgln ( int  sock,
char *  mesg 
)

int tcp_send_mesgln(int sock, char* mesg)

TCPメッセージ(文字列)に改行(\r\n)を付け加えて送信する.

Parameters
sockソケット記述子
mesg送信用メッセージ
Return values
0以上送信したバイト数.
JBXL_NET_SEND_ERROR失敗.

Definition at line 1345 of file network.c.

1346 {
1347  int cc, sz;
1348  char* buf;
1349 
1350  sz = (int)strlen(mesg) + 3; /* CR+LF+0x00 */
1351  buf = (char*)malloc(sz);
1352  if (buf==NULL) return JBXL_NET_SEND_ERROR;
1353 
1354  strncpy(buf, mesg, sz);
1355  strncat(buf, "\r\n", 2);
1356  cc = send(sock, buf, (int)strlen(buf), 0);
1357 
1358  free(buf);
1359  if (cc<0) cc = JBXL_NET_SEND_ERROR;
1360  return cc;
1361 }
unsigned char ** buf
Definition: jpeg_tool.h:96

References buf, and JBXL_NET_SEND_ERROR.

◆ to_address_char()

char* to_address_char ( unsigned char *  addr,
int  mask,
int  family 
)

char* to_address_char(unsigned char* addr, int mask, int family)

数字型の IPv4/IPv6 アドレス(サブネット付き)8/32Byteを文字型の [IPアドレス]/[ネットマスク] に変換する.

addr は必ずネットマスクの情報を含み,長さが 8/32Byteでないといけない.
to_address_num()と対で使うのが安全.

Parameters
addr変換するバイバリ型のIPアドレス
mask0: サブネットマスクの処理をしない.
mask0以外: サブネットマスクの処理を行う.
familyアドレスファミリー (AF_INET/AF_INET6)
Returns
[IPv4/IPv6 アドレス]/[ネットマスク] 形式の文字列.要 free
See also
to_address_num()

Definition at line 2496 of file network.c.

2497 {
2498  int mlen, plen, slen;
2499  char* str;
2500  if (addr==NULL) return NULL;
2501 
2502  plen = 16;
2503  mlen = LEN_IPADDR6*2;
2504  if (family!=AF_INET6) {
2505  family = AF_INET;
2506  plen = 4;
2507  mlen = LEN_IPADDR*2;
2508  }
2509 
2510  str = (char*)malloc(mlen);
2511  if (str==NULL) return NULL;
2512  memset(str, 0, mlen);
2513 
2514  inet_ntop(family, addr, str, mlen);
2515  if (mask==0) return str;
2516 
2517  slen = (int)strlen(str);
2518  str[slen++] = '/';
2519  inet_ntop(family, addr+plen, str+slen, mlen-slen);
2520 
2521  return str;
2522 }

References LEN_IPADDR, and LEN_IPADDR6.

◆ to_address_num()

unsigned char* to_address_num ( char *  addr,
int  mode,
int  mask,
int  family 
)

unsigned char* to_address_num(char* addr, int mode, int mask, int family)

文字型のアドレス [IPアドレス]/[ネットマスク] (例:202.26.159.140/255.255.255.0)を 数字型のアドレス(unsigned char* num)8/32Byte へ変換する.

省略された場所は 0とみなされる(例:202.26/255 → 202.26.0.0/255.0.0.0)
ネットマスク部全体が省略された場合は IPアドレス部に依存する.(202.26. → 202.26.0.0/255.255.0.0)
CIDER形式にも対応.ただし,ネットマスク部の妥当性はチェックしない.

Parameters
addr変換する文字型のIPアドレス または FQDN
mode0: IPアドレス以外のもの(英字)は NULL を返す.
mode0以外: FQDNはIPアドレスに変換して返す(時間がかかる)
mask0: サブネットマスクの処理をしない.
mask0以外: サブネットマスクの処理を行う.
familyアドレスファミリー (AF_INET/AF_INET6)
Returns
[IPv4/IPv6 アドレス],[ネットマスク] の長さ8/32Byteのバイナリ.要 free

Definition at line 2373 of file network.c.

2374 {
2375  unsigned char* num;
2376  char deli;
2377  char* ps;
2378  char* pc;
2379  char* uc = NULL;
2380  int i, len;
2381 
2382  if (addr==NULL) return NULL;
2383 
2384  deli = ':';
2385  len = 16;
2386  if (family!=AF_INET6) {
2387  deli = ':';
2388  len = 4;
2389  family = AF_INET;
2390  }
2391 
2392  // mode チェック
2393  if (mode==0) {
2394  i = (int)strlen(addr) - 1;
2395  while (i>0 && addr[i]==deli) i--;
2396  if (i>=0) {
2397  if (isalpha(addr[i])) return NULL;
2398  }
2399  }
2400 
2401  num = (unsigned char*)malloc(len*2);
2402  if (num==NULL) return NULL;
2403  memset(num, 0, len*2);
2404 
2405  // IPアドレス部の変換
2406  ps = awk(addr, '/', 1);
2407  if (ps==NULL) {
2408  free(num);
2409  return NULL;
2410  }
2411 
2412  uc = (char*)get_ipaddr_byname_num(ps, family);
2413  free(ps);
2414  if (uc==NULL) return NULL;
2415  memcpy(num, uc, len);
2416  free(uc);
2417 
2418  if (mask==0) return num;
2419 
2420  // 以下,サブネットマスク処理
2421  ps = awk(addr, '/', 2);
2422 
2423  // サブネットマスク部が省略された場合の処理
2424  if (ps==NULL) {
2425  int f = OFF;
2426  for (i=len-1; i>=0; i--) {
2427  if (num[i]!=0 || f==ON) {
2428  num[i+len] = 0xff;
2429  f = ON;
2430  }
2431  else {
2432  num[i+len] = 0;
2433  }
2434  }
2435  return num;
2436  }
2437 
2438  // サブネットマスク部の処理
2439  if (family==AF_INET) {
2440  for (i=0; i<len; i++) {
2441  pc = awk(ps, deli, i+1);
2442  if (pc==NULL) break;
2443  num[i+len] = (unsigned char)atoi(pc);
2444  free(pc);
2445  }
2446  }
2447  else {
2448  for (i=0; i<len/2; i++) {
2449  pc = awk(ps, deli, i+1);
2450  if (pc==NULL) break;
2451  int nn = strtol(pc, NULL, 16);
2452  num[len+i*2] = (unsigned char)(nn/256);
2453  num[len+i*2+1] = (unsigned char)(nn%256);
2454  free(pc);
2455  }
2456  }
2457  free(ps);
2458 
2459  // CIDER形式対応
2460  if (family==AF_INET && num[4]<=32) {
2461  int nn, cl = (int)num[4];
2462  for (i=0; i<4; i++) {
2463  nn = 8 - Max(0, Min(8, cl-8*i));
2464  num[i+4] = 0xff<<nn;
2465  }
2466  }
2467  else if (family==AF_INET6 && num[16]<16) {
2468  int nn, cl = num[16]%16*100 + num[17]/16*10 + num[17]%16;
2469  for (i=0; i<16; i++) {
2470  nn = 8 - Max(0, Min(8, cl-8*i));
2471  num[i+16] = 0xff<<nn;
2472  }
2473  }
2474 
2475  return num;
2476 }
#define Min(x, y)
Definition: common.h:250
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition: tools.c:567

References awk(), get_ipaddr_byname_num(), len, Max, Min, OFF, and ON.

Referenced by is_same_network().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ udp_client_socket_sockaddr_in()

int udp_client_socket_sockaddr_in ( char *  hostname,
int  port,
struct sockaddr_in *  sv_addr 
)

Definition at line 2553 of file network.c.

2554 {
2555  int sofd;
2556  struct hostent* shost = NULL;
2557 
2558  if (sv_addr==NULL) return JBXL_NET_INFO_ERROR;
2559 
2560  sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
2561  if (sofd<0) return JBXL_NET_SOCKET_ERROR;
2562 
2563  shost = gethostbyname(hostname);
2564  if (shost==NULL) {
2565  socket_close(sofd);
2566  return JBXL_NET_INFO_ERROR;
2567  }
2568 
2569  memset(sv_addr, 0, sizeof(*sv_addr));
2570  sv_addr->sin_family = AF_INET;
2571  sv_addr->sin_port = htons(port);
2572  memcpy(&(sv_addr->sin_addr), shost->h_addr, shost->h_length);
2573 
2574  return sofd;
2575 }

References JBXL_NET_INFO_ERROR, JBXL_NET_SOCKET_ERROR, and socket_close().

Here is the call graph for this function:

◆ udp_hole_punching()

void udp_hole_punching ( int  sock,
struct addrinfo *  addr,
int  nm 
)

void udp_hole_punching(int sock, struct sockaddr_in addr, int nm)

sock を使って,addrへ nmバイトの NULLデータを送信する.

Parameters
sockソケット記述子
addr相手のホストの情報が格納されて sockaddr_in 構造体
nm送信するデータ(NULL)の長さ

Definition at line 2534 of file network.c.

2535 {
2536  char data[LBUF];
2537 
2538  if (nm<=0) nm = 4; // for SLVoice
2539  else if (nm>LBUF) nm = LBUF;
2540 
2541  memset(data, 0, nm);
2542  udp_send(sock, data, nm, addr);
2543 
2544  return;
2545 }
#define LBUF
Definition: common.h:146
int udp_send(int sock, char *smsg, int size, struct addrinfo *sv_addr)
Definition: network.c:1199

References LBUF, and udp_send().

Here is the call graph for this function:

◆ udp_hole_punching_sockaddr_in()

void udp_hole_punching_sockaddr_in ( int  sock,
struct sockaddr_in  addr,
int  nm 
)

void udp_hole_punching_sockaddr_in(int sock, struct sockaddr_in addr, int nm)

sock を使って,addrへ nmバイトの NULLデータを送信する.

Parameters
sockソケット記述子
addr相手のホストの情報が格納されて sockaddr_in 構造体
nm送信するデータ(NULL)の長さ

Definition at line 2741 of file network.c.

2742 {
2743  char data[LBUF];
2744 
2745  if (nm<=0) nm = 4; // for SLVoice
2746  else if (nm>LBUF) nm = LBUF;
2747 
2748  memset(data, 0, nm);
2749  udp_send_sockaddr_in(sock, data, nm, &addr);
2750 
2751  return;
2752 }
int udp_send_sockaddr_in(int sock, char *smsg, int size, struct sockaddr_in *sv_addr)
use udp_send()
Definition: network.c:2593

References LBUF, and udp_send_sockaddr_in().

Here is the call graph for this function:

◆ udp_recv()

int udp_recv ( int  sock,
char *  rmsg,
int  size,
struct addrinfo *  sv_addr 
)

int udp_recv(int sock, char* rmsg, int size, struct addrinfo* sv_addr)

recvform() をラッピングした関数.UDPデータを受信する.

Parameters
sockソケット記述子
rmsg受信用データバッファ.関数内で初期化される.
sizeデータバッファのサイズ
sv_addrサーバの情報が格納された addrinfo 構造体へのポインタ.
Return values
1以上受信したバイト数.
0正常切断.
JBXL_NET_RECV_ERROR失敗
JBXL_ARGS_ERROR不正な引数

Definition at line 1166 of file network.c.

1167 {
1168  int cc;
1169  socklen_t cadlen;
1170 
1171  if (sv_addr==NULL) return JBXL_ARGS_ERROR;
1172 
1173  cadlen = (int)sv_addr->ai_addrlen;
1174  memset(rmsg, 0, size);
1175  cc = recvfrom(sock, rmsg, size, 0, sv_addr->ai_addr, &cadlen);
1176 
1177  if (cc<0) cc = JBXL_NET_RECV_ERROR;
1178  return cc;
1179 }

References JBXL_ARGS_ERROR, and JBXL_NET_RECV_ERROR.

Referenced by udp_recv_wait().

Here is the caller graph for this function:

◆ udp_recv_sockaddr_in()

int udp_recv_sockaddr_in ( int  sock,
char *  rmsg,
int  size,
struct sockaddr_in *  sv_addr 
)

Definition at line 2578 of file network.c.

2579 {
2580  int cc;
2581  socklen_t cadlen;
2582 
2583  if (sv_addr==NULL) return 0;
2584 
2585  cadlen = sizeof(*sv_addr);
2586  memset(rmsg, 0, size);
2587  cc = recvfrom(sock, rmsg, size, 0, (struct sockaddr*)sv_addr, &cadlen);
2588 
2589  return cc;
2590 }

Referenced by get_local_sockaddr_in().

Here is the caller graph for this function:

◆ udp_recv_wait()

int udp_recv_wait ( int  sock,
char *  rmsg,
int  size,
struct addrinfo *  sv_addr,
int  tm 
)

int udp_recv_wait(int sock, char* rmsg, int size, struct addrinfo* sv_addr, int tm)

UDP経由でデータを受信する.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters
sockソケット記述子
rmsg受信用データバッファ.関数内で初期化される.
sizeデータバッファのサイズ
sv_addrサーバの情報が格納された addrinfo 構造体へのポインタ.
tmタイムアウト時間.秒単位.
Return values
1以上受信したバイト数.
0正常切断.
JBXL_NET_RECV_ERROR失敗.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 1283 of file network.c.

1284 {
1285  int cc;
1286 
1287  if (recv_wait(sock, tm)) {
1288  cc = udp_recv(sock, rmsg, size, sv_addr);
1289  }
1290  else {
1291  return JBXL_NET_RECV_TIMEOUT;
1292  }
1293 
1294  if (cc<0) cc = JBXL_NET_RECV_ERROR;
1295  return cc;
1296 }
int udp_recv(int sock, char *rmsg, int size, struct addrinfo *sv_addr)
Definition: network.c:1166

References JBXL_NET_RECV_ERROR, JBXL_NET_RECV_TIMEOUT, recv_wait(), and udp_recv().

Referenced by udp_recv_Buffer_wait().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ udp_recv_wait_sockaddr_in()

int udp_recv_wait_sockaddr_in ( int  sock,
char *  rmsg,
int  size,
struct sockaddr_in *  sv_addr,
int  tm 
)

Definition at line 2605 of file network.c.

2606 {
2607  int cc;
2608 
2609  if (recv_wait(sock, tm)) {
2610  cc = udp_recv_sockaddr_in(sock, rmsg, size, sv_addr);
2611  }
2612  else {
2613  return JBXL_NET_RECV_TIMEOUT;
2614  }
2615  return cc;
2616 }
int udp_recv_sockaddr_in(int sock, char *rmsg, int size, struct sockaddr_in *sv_addr)
use udp_recv()
Definition: network.c:2578

Referenced by get_sockaddr_in_Buffer().

Here is the caller graph for this function:

◆ udp_send()

int udp_send ( int  sock,
char *  smsg,
int  size,
struct addrinfo *  sv_addr 
)

int udp_send(int sock, char* smsg, int size, struct addrinfo* sv_addr)

sendto() をラッピングした関数.UDP経由でデータを送る.

データ(smsg)のサイズ sizeに0以下を指定した場合は,smsgは文字列で あると見なしてサイズを自動的に計算する.

Parameters
sockソケット記述子
smsg送信するデータ
size送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす.
sv_addrサーバの情報を格納する addrinfo 構造体へのポインタ.
Return values
0以上送信したバイト数.
JBXL_NET_SEND_ERROR失敗
JBXL_ARGS_ERROR不正な引数

Definition at line 1199 of file network.c.

1200 {
1201  int cc;
1202 
1203  if (sv_addr==NULL) return JBXL_ARGS_ERROR;
1204 
1205  if (size<=0) size = (int)strlen(smsg);
1206  cc = sendto(sock, smsg, size, 0, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
1207 
1208  if (cc<0) cc = JBXL_NET_SEND_ERROR;
1209  return cc;
1210 }

References JBXL_ARGS_ERROR, and JBXL_NET_SEND_ERROR.

Referenced by udp_hole_punching().

Here is the caller graph for this function:

◆ udp_send_sockaddr_in()

int udp_send_sockaddr_in ( int  sock,
char *  smsg,
int  size,
struct sockaddr_in *  sv_addr 
)

Definition at line 2593 of file network.c.

2594 {
2595  int cc;
2596 
2597  if (sv_addr==NULL) return 0;
2598  if (size<=0) size = (int)strlen(smsg);
2599  cc = sendto(sock, smsg, size, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
2600 
2601  return cc;
2602 }

Referenced by udp_hole_punching_sockaddr_in().

Here is the caller graph for this function: