Lib/network4.c File Reference

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

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

Go to the source code of this file.

Functions

int udp_server_socket (int port)
 call socket(), bind()
int udp_server_socket_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind()
int udp_client_socket (char *hostname, int port, struct sockaddr_in *sv_addr)
 call socket()
int udp_bind (int sofd, int port)
 call bind()
int udp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen)
 call setsockopt(), bind()
int tcp_server_socket (int port)
 call socket(), bind(), listen()
int tcp_server_socket_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind(), listen()
int tcp_server_bind (int port)
 call socket(), bind()
int tcp_server_bind_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind()
int tcp_client_socket (char *hostname, int port)
 call socket(), connect()
int tcp_client_bind_socket (char *hostname, int sport, int cport)
 call socket(), bind(), connect()
int tcp_bind (int sofd, int port)
 call bind()
int tcp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen)
 call setsockopt(), bind()
int accept_intr (int sock, struct sockaddr *cl_addr, socklen_t *cdlen)
 call accept()
int tcp_connect (int sofd, char *hostname, int port)
 call connect()
int socket_close (int sofd)
 call shutdown(), close()
int udp_recv (int sock, char *rmsg, int size, struct sockaddr_in *sv_addr)
int udp_send (int sock, char *smsg, int size, struct sockaddr_in *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 sockaddr_in *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)
char * get_hostname_bynum (unsigned char *num)
 IPv4アドレス(数字) → ホスト名(文字列).
char * get_hostname (char *ipaddr)
 IPv4アドレス(文字列)→ ホスト名(文字列).
unsigned char * get_myipaddr_num ()
 自分の [IPアドレス],[ネットマスク](数字)
char * get_myipaddr ()
 自分の [IPアドレス]/[ネットマスク](文字列)
char * get_localip_bydest (char *dest)
 自分の IPv4アドレス(文字列)
char * get_ipaddr (struct in_addr sin_addr)
 構造体  → IPv4アドレス(文字列)
unsigned char * get_ipaddr_num (struct in_addr sin_addr)
 構造体  → IPv4アドレス(数字4byte)
char * get_ipaddr_byname (char *hostname)
 ホスト名 → IPv4アドレス(文字列) 
unsigned char * get_ipaddr_byname_num (char *hostname)
 ホスト名 → IPv4アドレス(数字4byte)
char * get_mynetaddr ()
 自分の IPv4ネットワークアドレス(文字列)
unsigned char * get_mynetaddr_num ()
 自分の IPv4ネットワークアドレス(数字)
struct sockaddr_in get_sockaddr (char *hostname, unsigned short cport)
struct sockaddr_in get_sockaddr_bynum (char *ipnum, unsigned short cport)
struct sockaddr_in get_local_sockaddr (unsigned short cport)
int is_same_sockaddr (struct sockaddr_in addr1, struct sockaddr_in addr2)
int is_same_network_num (unsigned char *addr1, unsigned char *addr2, unsigned char *mask)
int is_same_network (char *addr1, char *addr2, char *mask)
unsigned char * to_address_num8 (char *addr, int mode)
 IPアドレス(文字列)→ [IPアドレス],[ネットマスク](数字8byte).
char * to_address_char8 (unsigned char *n)
 [IPアドレス],[ネットマスク](数字8byte)→ IPアドレス(文字列)
unsigned char * to_address_num4 (char *addr, int mode)
 IPアドレス(文字列)→ [IPアドレス](数字4byte).
char * to_address_char4 (unsigned char *n)
 [IPアドレス](数字4byte)→ IPアドレス(文字列)
int recv_wait (int sock, int tm)
int recv_wait_twin (int sock1, int sock2, int tm)
int send_wait (int sock, int tm)
void udp_hole_punching (int sock, struct sockaddr_in addr, int nm)
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 init_network (void)
void cleanup_network (void)

Detailed Description

Author:
Fumi.Iseki (C)

このファイルは現在使用されていません. バージョンのチェックの為だけに残されています. 新しいファイルは network.c (network6.c) をご覧ください.

Definition in file network4.c.


Function Documentation

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 構造体へのポインタ
cdlen sockaddr 構造体(*cl_addr)のサイズ
Return values:
0以上 accept() で作成されたソケット記述子.
-1 エラー.

Definition at line 631 of file network4.c.

00632 {
00633     int nsofd = 0;
00634 
00635     do {
00636         nsofd = (int)accept(sock, cl_addr, cdlen);
00637     } while (nsofd==-1 && errno==EINTR);
00638 
00639     //if (nsofd<0) Error("accept_intr");
00640 
00641     return nsofd;
00642 }

void cleanup_network ( void   ) 

Definition at line 2084 of file network4.c.

02085 {
02086 #ifdef WIN32
02087     WSACleanup();
02088 #endif
02089 }

char* get_hostname ( char *  ipaddr  ) 

char* get_hostname(char* ipaddr)

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

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

Parameters:
ipaddr IPアドレス(文字列)または FQDN
Returns:
ホスト名(文字列).要 free

Definition at line 1040 of file network4.c.

References get_hostname_bynum(), and to_address_num4().

01041 {
01042     char*  name;
01043     unsigned char* num;
01044 
01045     num  = to_address_num4(ipaddr, 1);
01046     if (num==NULL) return NULL;
01047 
01048     name = get_hostname_bynum(num); 
01049     free(num);
01050 
01051     return name;    
01052 }

Here is the call graph for this function:

char* get_hostname_bynum ( unsigned char *  num  ) 

char* get_hostname_bynum(unsigned char* num)

バイナリのIPアドレス(長さ4byte)からホスト名を逆引きする.

Parameters:
num バイナリのIPアドレス(長さ4byte).
Returns:
ホスト名(文字列).要 free

Definition at line 1003 of file network4.c.

01004 {
01005     int   len;
01006     char* hname;
01007     struct hostent* hent;
01008 
01009     #ifdef WIN32
01010         hent = gethostbyaddr((const char*)num, 4, AF_INET);
01011     #else
01012         hent = gethostbyaddr(num, 4, AF_INET);
01013     #endif
01014     
01015     if (hent==NULL) return NULL;
01016 
01017     len = (int)strlen(hent->h_name);
01018     hname = (char*)malloc(len+1);
01019     if (hname==NULL) {
01020         free(hent);
01021         return NULL;
01022     }
01023     memcpy(hname, hent->h_name, len+1);
01024 
01025     return hname;    
01026 }

char* get_ipaddr ( struct in_addr  sin_addr  ) 

char* get_ipaddr(struct in_addr sin_addr)

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

Parameters:
sin_addr sockaddr_in 構造体の sin_addr メンバ.
Returns:
IPアドレス(文字列)へのポインタ.要 free
   struct sockaddr_in addr
   .........;
   ipaddr = get_ipaddr(addr.sin_addr); 

Definition at line 1293 of file network4.c.

Referenced by get_localip_bydest().

01294 {
01295     char* ip;
01296     unsigned char* pp;
01297 
01298     pp = (unsigned char*)&(sin_addr);
01299     if (pp[0]==0) return NULL;
01300 
01301     ip = (char*)malloc(16);
01302     if (ip==NULL) return NULL;
01303     memset(ip, 0, 16);
01304 
01305     snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01306 
01307     return ip;
01308 }

Here is the caller graph for this function:

char* get_ipaddr_byname ( char *  hostname  ) 

char* get_ipaddr_byname(char* hostname)

ホスト名から IPアドレスを獲得する.

Parameters:
hostname ホスト名
Returns:
IPアドレス(文字列)へのポインタ.要 free

Definition at line 1350 of file network4.c.

01351 {
01352     struct hostent *host;
01353     char* ip;
01354     unsigned char* pp;
01355 
01356     host = gethostbyname(hostname); 
01357     if (host==NULL) return NULL;
01358 
01359     ip = (char*)malloc(16);
01360     if (ip==NULL) return NULL;
01361     memset(ip, 0, 16);
01362 
01363     pp = (unsigned char*)(host->h_addr);
01364     snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01365 
01366     return ip;
01367 }

unsigned char* get_ipaddr_byname_num ( char *  hostname  ) 

unsigned char* get_ipaddr_byname_num(char* hostname)

ホスト名から IPアドレスを獲得する.

Parameters:
hostname ホスト名
Returns:
IPアドレス(バイナリ)へのポインタ(長さ4byte).要 free

Definition at line 1379 of file network4.c.

01380 {
01381     struct hostent *host;
01382     unsigned char* ip;
01383     unsigned char* pp;
01384 
01385     host = gethostbyname(hostname); 
01386     if (host==NULL) return NULL;
01387     ip = (unsigned char*)malloc(4);
01388     if (ip==NULL) return NULL;
01389 
01390     pp = (unsigned char*)(host->h_addr);
01391     memcpy(ip, pp, 4);
01392 
01393     return ip;
01394 }

unsigned char* get_ipaddr_num ( struct in_addr  sin_addr  ) 

unsigned char* get_ipaddr_num(struct in_addr sin_addr)

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

Parameters:
sin_addr sockaddr_in 構造体の sin_addr メンバ.
Returns:
IPアドレス(バイナリ)へのポインタ(長さ4byte).要 free
    struct sockaddr_in addr
    .........;
    ipaddr = get_ipaddr_num(addr.sin_addr); 

Definition at line 1326 of file network4.c.

01327 {
01328     unsigned char* ip;
01329     unsigned char* pp;
01330 
01331     ip = (unsigned char*)malloc(4);
01332     if (ip==NULL) return NULL;
01333 
01334     pp = (unsigned char*)&(sin_addr);
01335     memcpy(ip, pp, 4);
01336 
01337     return ip;
01338 }

struct sockaddr_in get_local_sockaddr ( unsigned short  cport  )  [read]

Definition at line 1501 of file network4.c.

01502 {
01503     struct sockaddr_in  ss_addr;
01504     struct hostent *shost;
01505 
01506 
01507     // localhost の情報を ss_addrに格納
01508     shost = gethostbyname("127.0.0.1");
01509 
01510     memset(&ss_addr, 0, sizeof(ss_addr));
01511     ss_addr.sin_family = AF_INET;
01512     ss_addr.sin_port   = htons(cport);
01513     memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
01514 
01515     return ss_addr;
01516 }

char* get_localip_bydest ( char *  dest  ) 

char* get_localip_bydest(char* dest)

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

Parameters:
dest 接続先の IPアドレス または FQDN
Returns:
IPアドレス(文字列)へのポインタ.要 free

Definition at line 1236 of file network4.c.

References get_ipaddr(), get_ipaddr_byname(), and socket_close().

01237 {
01238     int   err, sofd;
01239     socklen_t len;
01240     char* addr;
01241     char* ip;
01242     struct sockaddr_in localif;  
01243     struct sockaddr_in remote;             
01244     
01245     if (dest==NULL) return NULL;     
01246     ip = get_ipaddr_byname(dest);
01247     if (ip ==NULL)  return NULL;
01248 
01249     memset(&localif, 0, sizeof(struct sockaddr_in));  
01250     memset(&remote,  0, sizeof(struct sockaddr_in));  
01251     remote.sin_family      = AF_INET;  
01252     remote.sin_addr.s_addr = inet_addr(ip);  
01253     remote.sin_port        = htons(9999);             
01254     free(ip);
01255 
01256     sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);  
01257     if (sofd<0) return NULL;
01258 
01259       err = connect(sofd, (struct sockaddr*)&remote, sizeof(remote));
01260       if (err<0) {
01261           socket_close(sofd);
01262          return NULL;
01263     }
01264 
01265       len = sizeof(localif);
01266       err = getsockname(sofd, (struct sockaddr *)&localif, &len);
01267     if (err<0) {
01268           socket_close(sofd);
01269           return NULL;
01270     }
01271       socket_close(sofd);
01272 
01273     addr = get_ipaddr(localif.sin_addr);
01274       return addr;
01275 }

Here is the call graph for this function:

char* get_myipaddr ( void   ) 

char* get_myipaddr()

ネットワークインターフェイスを検索し,一番最初に見つけた UP状態で, ループバックでないインターフェイスのIPアドレスと ネットマスクを返す.
ただし,検索するインターフェイスの数は MAXIFNO 以内であり,それより多いものは無視する.

ネットマスクが必要ないなら get_localip() を使用しても良い.

Returns:
[IPアドレス]/[ネットマスク] の文字列.要 free
Attention:
Windows の場合は ネットマスクは取得できない.

Definition at line 1202 of file network4.c.

References get_myipaddr_num().

01203 {
01204     char* addr;
01205     unsigned char* n;
01206 
01207     n = get_myipaddr_num();
01208     if (n==NULL) return NULL;
01209 
01210     addr = (char*)malloc(32);
01211     if (addr==NULL) {
01212         free(n);
01213         return NULL;
01214     }
01215     memset(addr, 0, 32);
01216 
01217     snprintf(addr, 31, "%d.%d.%d.%d/%d.%d.%d.%d", n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
01218 
01219     free(n);
01220     return addr;
01221 }

Here is the call graph for this function:

unsigned char* get_myipaddr_num ( void   ) 

unsigned char* get_myipaddr_num()

ネットワークインターフェイスを検索し,一番最初に見つけた UP状態で, ループバックでないインターフェイスのIPアドレスとネットマスクを返す.
ただし,検索するインターフェイスの数は MAXIFNO 以内であり,それ以上は無視する.

自分自身のIPアドレスを知る方法としては, gethostname() と gethostbyname() を使う方法もある.

    struct hostent  *shost;
    .....................
    gethostname(hostname, sizeof(hostname));
    shost = gethostbyname(hostname);

また,get_localip() の方法も使える.

Returns:
[IPアドレス],[ネットマスク] の長さ8byteのバイナリ.要 free
See also:
get_localip(), get_localip_bydest()

Definition at line 1107 of file network4.c.

References MAXIFNO, and socket_close().

01108 {
01109     int    i, sofd, len;
01110 
01111     unsigned char*  addr = NULL;
01112     struct ifconf  ifc;
01113     struct ifreq*  ifq;
01114     struct ifreq*  ifp;
01115 
01116 
01117     len = sizeof(struct ifreq)*MAXIFNO;
01118     ifp = ifq = (struct ifreq*)malloc(len);
01119     if (ifq==NULL) return NULL;
01120     ifc.ifc_len = len;
01121     ifc.ifc_req = ifq;
01122 
01123     sofd = socket(AF_INET, SOCK_DGRAM, 0);
01124     if (sofd<0) {
01125           perror("get_myipaddr_num: socket");
01126         return NULL;
01127     }
01128 
01129 
01130     // インターフェイス名の取得
01131     if (ioctl(sofd, SIOCGIFCONF, &ifc)<0) {
01132         socket_close(sofd);
01133         free(ifq);
01134         return NULL;
01135     }
01136 
01137 
01138     ifp = ifq;
01139     for (i=0; i<MAXIFNO; i++) {
01140 
01141         // インターフェイスのフラグ取得
01142         if (ioctl(sofd, SIOCGIFFLAGS, ifp)<0) {
01143             socket_close(sofd);
01144             free(ifq);
01145             return NULL;
01146         }
01147 
01148         if ((ifp->ifr_flags&IFF_UP) && !(ifp->ifr_flags&IFF_LOOPBACK)) {
01149             int j;
01150             unsigned char* p = (unsigned char*)ifp->ifr_addr.sa_data;
01151 
01152             addr = (unsigned char*)malloc(8);
01153             if (addr==NULL) {
01154                 socket_close(sofd);
01155                 free(ifq);
01156                 return NULL;
01157             }
01158 
01159             // アドレス取得
01160             if (ioctl(sofd, SIOCGIFADDR, ifp)<0) {
01161                 socket_close(sofd);
01162                 free(ifq);
01163                 free(addr);
01164                 return NULL;
01165             }
01166             for (j=0; j<4; j++) addr[j] = p[j+2];
01167 
01168             // ネットマスク取得
01169             if (ioctl(sofd, SIOCGIFNETMASK, ifp)<0) {
01170                 socket_close(sofd);
01171                 free(ifq);
01172                 free(addr);
01173                 return NULL;
01174             }
01175             for (j=0; j<4; j++) addr[j+4] = p[j+2];
01176 
01177             return addr;
01178         }
01179         ifp++;
01180     }
01181     
01182     socket_close(sofd);
01183     free(ifq);
01184     return NULL;
01185 }

Here is the call graph for this function:

char* get_mynetaddr ( void   ) 

char* get_mynetaddr()

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

Returns:
ネットワークアドレス(文字列)へのポインタ.要 free

Definition at line 1405 of file network4.c.

References get_mynetaddr_num().

01406 {
01407     char* net;
01408     unsigned char* pp;
01409 
01410     pp = get_mynetaddr_num();
01411     if (pp==NULL) return NULL;
01412 
01413     net = (char*)malloc(16);
01414     if (net==NULL) {
01415         free(pp);
01416         return NULL;
01417     }
01418     memset(net, 0, 16);
01419 
01420     snprintf(net, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01421 
01422     free(pp);
01423     return net;
01424 }

Here is the call graph for this function:

unsigned char* get_mynetaddr_num ( void   ) 

unsigned char* get_mynetaddr_num()

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

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

Definition at line 1435 of file network4.c.

References get_myipaddr_num().

01436 {
01437     int  i;
01438     unsigned char* net;
01439     unsigned char* ip;
01440     unsigned char* mk;
01441         
01442     ip = get_myipaddr_num();
01443     if (ip==NULL) return NULL;
01444     mk = &(ip[4]);
01445 
01446     net = (unsigned char*)malloc(4);
01447     if (net==NULL) {
01448         free(ip);
01449         return NULL;
01450     }
01451 
01452     for (i=0; i<4; i++) net[i] = ip[i] & mk[i];
01453 
01454     free(ip);
01455     return net;
01456 }

Here is the call graph for this function:

struct sockaddr_in get_sockaddr ( char *  hostname,
unsigned short  cport 
) [read]

Definition at line 1464 of file network4.c.

01465 {
01466     struct sockaddr_in  ss_addr;
01467     struct hostent *shost;
01468 
01469     // Serverの情報を ss_addrに格納
01470     shost = gethostbyname(hostname);
01471     if (shost==NULL) {
01472         ss_addr.sin_family = 0;
01473         ss_addr.sin_port   = 0;
01474         return ss_addr;
01475     }
01476 
01477     memset(&ss_addr, 0, sizeof(ss_addr));
01478     ss_addr.sin_family = AF_INET;
01479     ss_addr.sin_port   = htons(cport);
01480     memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
01481 
01482     return ss_addr;
01483 }

struct sockaddr_in get_sockaddr_bynum ( char *  ipnum,
unsigned short  cport 
) [read]

Definition at line 1487 of file network4.c.

01488 {
01489     struct sockaddr_in  ss_addr;
01490 
01491     memset(&ss_addr, 0, sizeof(ss_addr));
01492     ss_addr.sin_family = AF_INET;
01493     ss_addr.sin_port   = htons(cport);
01494     memcpy(&(ss_addr.sin_addr), ipnum, 4);
01495 
01496     return ss_addr;
01497 }

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

Definition at line 2037 of file network4.c.

References tcp_client_bind_socket.

02038 {
02039     int  i, sock, range;
02040 
02041     range  = max - min + 1;
02042     *cport = rand()%range + min;
02043 
02044     i = 1;
02045     sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
02046     while(sock<0 && i<range) {
02047         (*cport)++;
02048         if (*cport>max) *cport = ((int)*cport)%max + min - 1;
02049         sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
02050         i++;
02051     }
02052 
02053     if (sock<=0) *cport = 0;
02054 
02055     return sock;
02056 }

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

Definition at line 2014 of file network4.c.

References tcp_server_socket.

02015 {
02016     int  i, sock, range;
02017 
02018     range = max - min + 1;
02019     *port = rand()%range + min;
02020 
02021     i = 1;
02022     sock = tcp_server_socket((int)*port);
02023     while(sock<=0 && i<range) {
02024         (*port)++;
02025         if (*port>max) *port = ((int)*port)%max + min - 1;
02026         sock = tcp_server_socket((int)*port);
02027         i++;
02028     }
02029 
02030     if (sock<=0) *port = 0;
02031 
02032     return sock;
02033 }

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

Definition at line 1991 of file network4.c.

References udp_server_socket.

01992 {
01993     int  i, sock, range;
01994 
01995     range = max - min + 1;
01996     *port = rand()%range + min;
01997 
01998     i = 1;
01999     sock = udp_server_socket((int)*port);
02000     while(sock<=0 && i<range) {
02001         (*port)++;
02002         if (*port>max) *port = ((int)*port)%max + min - 1;
02003         sock = udp_server_socket((int)*port);
02004         i++;
02005     }
02006 
02007     if (sock<=0) *port = 0;
02008 
02009     return sock;
02010 }

int init_network ( void   ) 

Definition at line 2071 of file network4.c.

02072 {
02073     int ret = 0;
02074 
02075 #ifdef WIN32
02076     ret = WSAStartup(MAKEWORD(2,0), &WsaData);
02077     if (ret!=0) WSACleanup();
02078 #endif
02079 
02080     return  ret;
02081 }

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 比較するアドレス(文字型)
addr2 比較するアドレス(文字型)
mask ネットマスク(文字型)
Return values:
TRUE 同じネットワークである.
FALSE 同じネットワークでない.

Definition at line 1603 of file network4.c.

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

01604 {
01605     int  ret;
01606     unsigned char* a1;
01607     unsigned char* a2;
01608     unsigned char* mk;
01609 
01610     if (addr1==NULL || addr2==NULL || mask==NULL) return FALSE;
01611 
01612     a1 = to_address_num4(addr1, 1);
01613     a2 = to_address_num4(addr2, 1);
01614     mk = to_address_num4(mask,  0);
01615     if (a1==NULL || a2==NULL || mk==NULL) {
01616         freeNull(a1);
01617         freeNull(a2);
01618         freeNull(mk);
01619         return FALSE;
01620     }
01621 
01622     ret = is_same_network_num(a1, a2, mk);
01623     freeNull(a1);
01624     freeNull(a2);
01625     freeNull(mk);
01626     
01627     return ret;
01628 }

Here is the call graph for this function:

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

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

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

Parameters:
addr1 比較するアドレス(数字型)4Byte
addr2 比較するアドレス(数字型)4Byte
mask ネットマスク(数字型)4Byte
Return values:
TRUE 同じネットワークである.
FALSE 同じネットワークでない

Definition at line 1569 of file network4.c.

References FALSE, and TRUE.

01570 {
01571     int i;
01572 
01573     if (addr1==NULL || addr2==NULL) return FALSE;
01574 
01575     if (mask==NULL) {
01576         for (i=0; i<4; i++) {
01577             if (addr1[i] != addr2[i]) return FALSE;
01578         }
01579     }
01580     else {
01581         for (i=0; i<4; i++) {
01582             if ((addr1[i]&mask[i]) != (addr2[i]&mask[i])) return FALSE;
01583         }
01584     }
01585     return TRUE;
01586 }

int is_same_sockaddr ( struct sockaddr_in  addr1,
struct sockaddr_in  addr2 
)

int is_same_sockaddr(struct sockaddr_in addr1, struct sockaddr_in addr2)

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

Parameters:
addr1 比較する sockaddr_in 構造体
addr2 比較する sockaddr_in 構造体
Return values:
TRUE 同じホスト
FALSE 違うホスト

Definition at line 1531 of file network4.c.

References FALSE, and TRUE.

01532 {
01533     int i, len;
01534     unsigned char *p1, *p2;
01535 
01536     p1  = (unsigned char*)&(addr1.sin_addr);
01537     p2  = (unsigned char*)&(addr2.sin_addr);
01538     len = sizeof(addr1.sin_addr);
01539 
01540     for (i=0; i<len; i++) {
01541         if (p1[i]!=p2[i]) return FALSE;
01542     }
01543 
01544     p1  = (unsigned char*)&(addr1.sin_port);
01545     p2  = (unsigned char*)&(addr2.sin_port);
01546     len = sizeof(addr1.sin_port);
01547 
01548     for (i=0; i<len; i++) {
01549         if (p1[i]!=p2[i]) return FALSE;
01550     }
01551 
01552     return TRUE;
01553 }

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 1874 of file network4.c.

01875 {
01876     int    nd;
01877     fd_set mask;
01878     struct timeval timeout;
01879     time_t otm, ntm;
01880 
01881     otm = time(NULL);
01882     do {
01883         timeout.tv_sec  = tm;
01884         timeout.tv_usec = 0;
01885         FD_ZERO(&mask);
01886         FD_SET(sock, &mask);
01887 
01888         //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
01889         nd  = select(sock+1, &mask, NULL, NULL, &timeout);
01890         ntm = time(NULL);
01891     } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
01892 
01893     return FD_ISSET(sock, &mask);     
01894 }

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 タイムアウトした.
1 sock1 のバッファにデータがある.
2 sock2 のバッファにデータがある.
3 sock1 と sock2 のバッファにデータがある.

Definition at line 1898 of file network4.c.

References Max.

01899 {
01900     int       ret = 0;
01901     int    nm, nd;
01902     fd_set mask;
01903     struct timeval timeout;
01904     time_t otm, ntm;
01905 
01906     nm  = Max(sock1, sock2);
01907     otm = time(NULL);
01908     do {
01909         timeout.tv_sec  = tm;
01910         timeout.tv_usec = 0;
01911         FD_ZERO(&mask);
01912         FD_SET(sock1, &mask);
01913         FD_SET(sock2, &mask);
01914         nd  = select(nm+1, &mask, NULL, NULL, &timeout);
01915         ntm = time(NULL);
01916     } while ((nd<0 || (!FD_ISSET(sock1, &mask) && !FD_ISSET(sock2, &mask))) && (int)(ntm-otm)<=tm);
01917 
01918     if (FD_ISSET(sock1, &mask)) ret += 1;
01919     if (FD_ISSET(sock2, &mask)) ret += 2;
01920 
01921     return ret;
01922 }

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 1937 of file network4.c.

01938 {
01939     int    nd;
01940     fd_set mask;
01941     struct timeval timeout;
01942     time_t otm, ntm;
01943 
01944     otm = time(NULL);
01945     do {
01946         timeout.tv_sec  = tm;
01947         timeout.tv_usec = 0;
01948         FD_ZERO(&mask);
01949         FD_SET(sock, &mask);
01950 
01951         //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
01952         nd  = select(sock+1, NULL, &mask, NULL, &timeout);
01953         ntm = time(NULL);
01954     } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
01955 
01956     return FD_ISSET(sock, &mask);     
01957 }

int socket_close ( int  sofd  ) 

int socket_close(int sofd)

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

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

Definition at line 693 of file network4.c.

00694 {
00695     int  err = -1;
00696 
00697     if (sofd>0) {
00698         #ifdef WIN32
00699             err = shutdown(sofd, 2);
00700             closesocket(sofd);
00701         #else
00702             err = shutdown(sofd, SHUT_RDWR);
00703             close(sofd);
00704         #endif
00705     }
00706     return err;
00707 }

int tcp_bind ( int  sofd,
int  port 
)

int tcp_bind(int sofd, int port)

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

Parameters:
sofd バインドするソケットの記述子.
port ポート番号
Return values:
sofd 成功
-3 失敗

Definition at line 547 of file network4.c.

References socket_close().

00548 {
00549     int  err;
00550     struct sockaddr_in sv_addr;
00551  
00552     if (sofd<=0) return sofd;
00553 
00554     memset(&sv_addr, 0, sizeof(sv_addr));
00555     sv_addr.sin_family = AF_INET;
00556     sv_addr.sin_port   = htons(port);
00557     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00558 
00559     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00560     if (err<0) {
00561         socket_close(sofd);
00562         return -3;
00563     }
00564 
00565     return sofd;
00566 }

Here is the call graph for this function:

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

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

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

Parameters:
sofd バインドするソケットの記述子.
port ポート番号
opt オプションの種類
optval オプションデータ
optlen optval の長さ
Return values:
0以上 作成されたソケット記述子.
-2 ソケットオプションの設定に失敗.
-3 バインドに失敗.

Definition at line 584 of file network4.c.

References socket_close().

00585 {
00586     int  err;
00587     struct sockaddr_in sv_addr;
00588  
00589     if (sofd<=0) return sofd;
00590 
00591     if (opt>0) {
00592         #ifdef WIN32
00593             err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00594         #else
00595             err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00596         #endif
00597         if (err<0) {
00598             socket_close(sofd);
00599             return -2;
00600         } 
00601     }
00602 
00603     memset(&sv_addr, 0, sizeof(sv_addr));
00604     sv_addr.sin_family = AF_INET;
00605     sv_addr.sin_port   = htons(port);
00606     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00607 
00608     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00609     if (err<0) {
00610         socket_close(sofd);
00611         return -3;
00612     }
00613 
00614     return sofd;
00615 }

Here is the call graph for this function:

int tcp_client_bind_socket ( char *  hostname,
int  sport,
int  cport 
)

int tcp_client_bind_socket(char* hostname, int sport, int cport)

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

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

Parameters:
hostname サーバ名
sport サーバポート番号
cport 自分のポート番号
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-3 バインドに失敗.
-4 サーバ情報の取得に失敗.
-5 サーバへの接続に失敗.

Definition at line 495 of file network4.c.

References socket_close().

00496 {
00497     int sofd, err;
00498     struct hostent  *shost;
00499     struct sockaddr_in sv_addr;
00500 
00501     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00502     if (sofd<0) return -1;
00503  
00504     memset(&sv_addr, 0, sizeof(sv_addr));
00505     sv_addr.sin_family = AF_INET;
00506     sv_addr.sin_port   = htons(cport);
00507     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00508 
00509     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00510     if (err<0) {
00511         socket_close(sofd);
00512         return -3;
00513     }
00514 
00515     shost = gethostbyname(hostname); 
00516     if (shost==NULL) {
00517         socket_close(sofd);
00518         return -4;
00519     }
00520 
00521     memset(&sv_addr, 0, sizeof(sv_addr));
00522     sv_addr.sin_family = AF_INET;
00523     sv_addr.sin_port   = htons(sport);
00524     memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00525 
00526     err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00527     if (err<0) {
00528         socket_close(sofd);
00529         return -5;
00530     }
00531 
00532     return sofd;
00533 }

Here is the call graph for this function:

int tcp_client_socket ( char *  hostname,
int  port 
)

int tcp_client_socket(char* hostname, int port)

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

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

Parameters:
hostname サーバ名
port サーバポート番号
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-4 サーバ情報の取得に失敗.
-5 サーバへの接続に失敗.

Definition at line 448 of file network4.c.

References socket_close().

00449 {
00450     int sofd, err;
00451     struct hostent     *shost;
00452     struct sockaddr_in sv_addr;
00453 
00454     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00455     if (sofd<0) return -1;
00456  
00457     shost = gethostbyname(hostname); 
00458     if (shost==NULL) {
00459         socket_close(sofd);
00460         return -4;
00461     }
00462 
00463     memset(&sv_addr, 0, sizeof(sv_addr));
00464     sv_addr.sin_family = AF_INET;
00465     sv_addr.sin_port   = htons(port);
00466     memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00467 
00468     err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00469     if (err<0) {
00470         socket_close(sofd);
00471         return -5;
00472     }
00473 
00474     return sofd;
00475 }

Here is the call graph for this function:

int tcp_connect ( int  sofd,
char *  hostname,
int  port 
)

Definition at line 660 of file network4.c.

00661 {
00662     int  err;
00663     struct hostent  *shost;
00664     struct sockaddr_in sv_addr;
00665 
00666     shost = gethostbyname(hostname); 
00667     if (shost==NULL) return -4;
00668 
00669     memset(&sv_addr, 0, sizeof(sv_addr));
00670     sv_addr.sin_family = AF_INET;
00671     sv_addr.sin_port   = htons(port);
00672     memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00673 
00674     err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00675     if (err<0) return -5;
00676     return 0;
00677 }

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 正常切断.
-1 失敗

Definition at line 786 of file network4.c.

00787 {
00788     int cc;
00789 
00790     memset(rmsg, 0, size);
00791     cc = recv(sock, rmsg, size, 0);
00792 
00793     return cc;
00794 }

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を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (RECV_TIMEOUTED が返る).

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

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

Definition at line 954 of file network4.c.

References get_mstream(), make_mstream, put_mstream(), RECVBUFSZ, and tcp_recv_wait().

00955 {
00956     int  cc;
00957     unsigned char* pp;
00958 
00959     if (mesg==NULL || sb==NULL) return -2;
00960     memset(mesg, 0, sz);
00961 
00962     if (sb->buf==NULL) {
00963         *sb = make_mstream(RECVBUFSZ);
00964         if (sb->buf==NULL) return -3;
00965     }
00966 
00967     while (sb->datano==0) {
00968         cc = tcp_recv_wait(sock, mesg, sz, tm);
00969         if (cc<=0) return cc;
00970         put_mstream(sb, (unsigned char*)mesg);
00971         memset(mesg, 0, sz);
00972     }
00973 
00974     pp = get_mstream(sb);
00975     if (pp==NULL) return -4;
00976     if (strlen((const char*)pp)>=(unsigned int)sz) {
00977         memcpy(mesg, pp, sz-1);
00978         free(pp);
00979         return -5;
00980     }
00981     memcpy(mesg, pp, strlen((const char*)pp));
00982 
00983     free(pp);
00984     return (int)strlen(mesg);
00985 }

Here is the call graph for this function:

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() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウトとなる (RECV_TIMEOUTED が返る).

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

Definition at line 876 of file network4.c.

References RECV_TIMEOUTED, and recv_wait().

00877 {
00878     int  cc;
00879 
00880     if (recv_wait(sock, tm)) {
00881         cc = recv(sock, mesg, sz, 0); 
00882     }
00883     else {
00884         return RECV_TIMEOUTED;
00885     }
00886     return cc;
00887 }

Here is the call graph for this function:

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以上 送信したバイト数.
-1 失敗.

Definition at line 812 of file network4.c.

00813 {
00814     int cc;
00815 
00816     if (size<=0) size = (int)strlen(smsg);
00817     cc = send(sock, smsg, size, 0);
00818 
00819     return cc;
00820 }

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以上 送信したバイト数.
-1 失敗.

Definition at line 902 of file network4.c.

00903 {
00904     int   cc, sz;
00905     char* buf;
00906 
00907     sz = (int)strlen(mesg) + 3;    /* CR+LF+0x00 */
00908     buf = (char*)malloc(sz);
00909     if (buf==NULL) return -1;
00910 
00911     strncpy(buf, mesg, sz);
00912     strncat(buf, "\r\n", 2);
00913 //    hton_ar(buf, strlen(buf));
00914     cc = send(sock, buf, (int)strlen(buf), 0);
00915 
00916     free(buf);
00917     return cc;
00918 }

int tcp_server_bind ( int  port  ) 

int tcp_server_bind(int port)

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

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

Parameters:
port ポート番号.
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-3 バインドに失敗.

Definition at line 357 of file network4.c.

References socket_close().

00358 {
00359     int  sofd, err;
00360     struct sockaddr_in sv_addr;
00361  
00362     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00363     if (sofd<0) return -1;
00364  
00365     memset(&sv_addr, 0, sizeof(sv_addr));
00366     sv_addr.sin_family = AF_INET;
00367     sv_addr.sin_port   = htons(port);
00368     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00369 
00370     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00371     if (err<0) {
00372         socket_close(sofd);
00373         return -3;
00374     }
00375 
00376     return sofd;
00377 }

Here is the call graph for this function:

int tcp_server_bind_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen 
)

int tcp_server_bind_setopt(int port, int opt, const void* optval, int optlen)

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

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

Parameters:
port ポート番号
opt オプションの種類
optval オプションデータ
optlen optval の長さ
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-2 ソケットオプションの設定に失敗.
-3 バインドに失敗.

Definition at line 398 of file network4.c.

References socket_close().

00399 {
00400     int  sofd, err;
00401     struct sockaddr_in sv_addr;
00402  
00403     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00404     if (sofd<0) return -1;
00405  
00406     if (opt>0) {
00407         #ifdef WIN32
00408             err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00409         #else
00410             err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00411         #endif
00412         if (err<0) {
00413             socket_close(sofd);
00414             return -2;
00415         }
00416     }
00417 
00418     memset(&sv_addr, 0, sizeof(sv_addr));
00419     sv_addr.sin_family = AF_INET;
00420     sv_addr.sin_port   = htons(port);
00421     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00422 
00423     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00424     if (err<0) {
00425         socket_close(sofd);
00426         return -3;
00427     }
00428 
00429     return sofd;
00430 }

Here is the call graph for this function:

int tcp_server_socket ( int  port  ) 

int tcp_server_socket(int port)

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

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

Parameters:
port ポート番号.
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-3 バインドに失敗.
-6 リッスンの設定に失敗.

Definition at line 252 of file network4.c.

References socket_close().

00253 {
00254     int  sofd, err;
00255     struct sockaddr_in sv_addr;
00256  
00257     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00258     if (sofd<0) return -1;
00259  
00260     memset(&sv_addr, 0, sizeof(sv_addr));
00261     sv_addr.sin_family = AF_INET;
00262     sv_addr.sin_port   = htons(port);
00263     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00264 
00265     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00266     if (err<0) {
00267         socket_close(sofd);
00268         return -3;
00269     }
00270 
00271     err = listen(sofd, 10);
00272     if (err==-1) {
00273         socket_close(sofd);
00274         return -6;
00275     }
00276 
00277     return sofd;
00278 }

Here is the call graph for this function:

int tcp_server_socket_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen 
)

int tcp_server_socket_setopt(int port, int opt, const void* optval, int optlen)

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

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

Parameters:
port ポート番号
opt オプションの種類
optval オプションデータ
optlen optval の長さ
Return values:
0以上 作成されたソケット記述子.
-1 ソケットの作成に失敗.
-2 ソケットオプションの設定に失敗.
-3 バインドに失敗.
-6 リッスンの設定に失敗.

Definition at line 302 of file network4.c.

References socket_close().

00303 {
00304     int  sofd, err;
00305     struct sockaddr_in sv_addr;
00306  
00307     sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00308     if (sofd<0) return -1;
00309  
00310     memset(&sv_addr, 0, sizeof(sv_addr));
00311     sv_addr.sin_family = AF_INET;
00312     sv_addr.sin_port   = htons(port);
00313     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00314 
00315     if (opt>0) {
00316         #ifdef WIN32
00317             err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00318         #else
00319             err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00320         #endif
00321         if (err<0) {
00322             socket_close(sofd);
00323             return -2;
00324         }
00325     }
00326 
00327     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00328     if (err<0) {
00329         socket_close(sofd);
00330         return -3;
00331     }
00332 
00333     err = listen(sofd, 10);
00334     if (err==-1) {
00335         socket_close(sofd);
00336         return -6;
00337     }
00338 
00339     return sofd;
00340 }

Here is the call graph for this function:

char* to_address_char4 ( unsigned char *  n  ) 

char* to_address_char4(unsigned char* n)

数字型の IPアドレス n 4Byteを文字型の [IPアドレス] に変換する.

n は必ず長さが 4Byteでないといけない.4Byteより少ない場合は恐らくセグメンテーションエラーを起こす.
to_address_num4()と対で使うのが安全.

Parameters:
n 長さが 4byteのバイナリの [IPアドレス]
Returns:
[IPアドレス] 形式の文字列.要 free
See also:
to_address_num4()

Definition at line 1847 of file network4.c.

01848 {
01849     char* addr;
01850     if (n==NULL) return NULL;
01851 
01852     addr = (char*)malloc(16);
01853     if (addr==NULL) return NULL;
01854     memset(addr, 0, 16);
01855 
01856     snprintf(addr, 15, "%d.%d.%d.%d", n[0], n[1], n[2], n[3]);
01857 
01858     return addr;
01859 }

char* to_address_char8 ( unsigned char *  n  ) 

char* to_address_char8(unsigned char* n)

数字型の IPアドレス n 8Byteを文字型の [IPアドレス]/[ネットマスク] に変換する.

n は必ずネットマスクの情報を含み,長さが 8Byteでないといけない.8Byteより少ない場合は 恐らくセグメンテーションエラーを起こす.
to_address_num()と対で使うのが安全.

Parameters:
n 長さが 8byteの バイナリの [IPアドレス],[ネットマスク]
Returns:
[IPアドレス]/[ネットマスク] 形式の文字列.要 free
See also:
to_address_num()

Definition at line 1756 of file network4.c.

01757 {
01758     char* addr;
01759     if (n==NULL) return NULL;
01760 
01761     addr = (char*)malloc(32);
01762     if (addr==NULL) return NULL;
01763     memset(addr, 0, 32);
01764 
01765     snprintf(addr, 31, "%d.%d.%d.%d/%d.%d.%d.%d", n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
01766 
01767     return addr;
01768 }

unsigned char* to_address_num4 ( char *  addr,
int  mode 
)

unsigned char* to_address_num4(char* addr, int mode)

文字型のアドレス [IPアドレス] (例:202.26.159.140)を 数字型のアドレス(unsigned char* num[4])4Byte へ変換する.

省略された場所は 0とみなされる(例:202.26 → 202.26.0.0)

Parameters:
addr 変換する文字型のIPアドレス
mode 0: IPアドレス以外のもの(英字)は NULL を返す.
mode 0以外: FQDNはIPアドレスに変換して返す(時間がかかる)
Returns:
[IPアドレス] の長さ4byteのバイナリ.要 free

Definition at line 1786 of file network4.c.

References awk(), and get_ipaddr_byname_num().

Referenced by get_hostname(), and is_same_network().

01787 {
01788     unsigned char* num;
01789     char* pc;
01790     char* uc = NULL;
01791     int   i;
01792 
01793     if (addr==NULL) return NULL;
01794 
01795     num = (unsigned char*)malloc(4);
01796     if (num==NULL) return NULL;
01797     memset(num, 0, 4);
01798 
01799     // IPアドレス部の変換
01800     i = (int)strlen(addr) - 1;
01801     while (i>0 && addr[i]=='.') i--;
01802     if (i>0) {
01803         if (isalpha(addr[i])) {
01804             if (mode==0) { // mode==0なら FQDN->IPアドレス は行なわない.
01805                 free(num);
01806                 return NULL;
01807             }
01808             uc = (char*)get_ipaddr_byname_num(addr);
01809             if (uc==NULL) {
01810                 free(num);
01811                 return NULL;
01812             }
01813         }
01814     }
01815 
01816     if (uc==NULL) {                         // IPアドレス表記の処理    
01817         for (i=0; i<4; i++) {
01818             pc = awk(addr, '.', i+1);
01819             if (pc==NULL) break;
01820             num[i] = (unsigned char)atoi(pc);
01821             free(pc);
01822         }
01823     }
01824     else {                                     // ホスト名表記の処理
01825         for (i=0; i<4; i++) num[i] = uc[i];
01826         free(uc);
01827     }
01828 
01829     return  num;
01830 }

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned char* to_address_num8 ( char *  addr,
int  mode 
)

unsigned char* to_address_num8(char* addr, int mode)

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

省略された場所は 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アドレス
mode 0: IPアドレス以外のもの(英字)は NULL を返す.
mode 0以外: FQDNはIPアドレスに変換して返す(時間がかかる)
Returns:
[IPアドレス],[ネットマスク] の長さ8byteのバイナリ.要 free

Definition at line 1648 of file network4.c.

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

01649 {
01650     unsigned char* num;
01651     char* ps;
01652     char* pc;
01653     char* uc = NULL;
01654     int   i;
01655 
01656     if (addr==NULL) return NULL;
01657 
01658     num = (unsigned char*)malloc(8);
01659     if (num==NULL) return NULL;
01660     memset(num, 0, 8);
01661 
01662 
01663     // IPアドレス部の変換
01664      ps = awk(addr, '/', 1);
01665     if (ps==NULL) {
01666         free(num);
01667         return NULL;
01668     }
01669 
01670     i = (int)strlen(ps) - 1;
01671     while (i>0 && ps[i]=='.') i--;
01672     if (i>0) {
01673         if (isalpha(ps[i])) {
01674             if (mode==0) { // mode==0なら FQDN->IPアドレス は行なわない.
01675                 free(num);
01676                 free(ps);
01677                 return NULL;
01678             }
01679             uc = (char*)get_ipaddr_byname_num(ps);
01680             if (uc==NULL) {
01681                 free(num);
01682                 free(ps);
01683                 return NULL;
01684             }
01685         }
01686     }
01687 
01688     if (uc==NULL) {                         // IPアドレス表記の処理    
01689         for (i=0; i<4; i++) {
01690             pc = awk(ps, '.', i+1);
01691             if (pc==NULL) break;
01692             num[i] = (unsigned char)atoi(pc);
01693             free(pc);
01694         }
01695     }
01696     else {                                     // ホスト名表記の処理
01697         for (i=0; i<4; i++) num[i] = uc[i];
01698         free(uc);
01699     }
01700     free(ps);
01701 
01702     ps = awk(addr, '/', 2);
01703 
01704     // サブネットマスク部が省略された場合の処理
01705     if (ps==NULL) {
01706         int f = OFF;
01707         for (i=3; i>=0; i--) {
01708             if (num[i]!=0 || f==ON) {
01709                 num[i+4] = 0xff;
01710                 f = ON;
01711             }
01712             else {
01713                 num[i+4] = 0;
01714             }
01715         }
01716         return num;
01717     }
01718 
01719     // サブネットマスク部の処理
01720     for (i=0; i<4; i++) {
01721         pc = awk(ps, '.', i+1);
01722         if (pc==NULL) break;
01723         num[i+4] = (unsigned char)atoi(pc);
01724         free(pc);
01725     }
01726     free(ps);
01727 
01728     // CIDER形式対応
01729     if (num[4]<=32 && num[5]==0 && num[6]==0 && num[7]==0) {
01730         int nn, cl = (int)num[4];
01731         for (i=0; i<4; i++) {
01732             nn = 8 - Max(0, Min(8, cl-8*i));
01733             num[i+4] = 0xff<<nn;
01734         }
01735     }
01736 
01737     return  num;
01738 }

Here is the call graph for this function:

int udp_bind ( int  sofd,
int  port 
)

int udp_bind(int sofd, int port)

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

Parameters:
sofd バインドするソケットの記述子.
port ポート番号
Return values:
sofd 成功
-3 失敗

Definition at line 166 of file network4.c.

References socket_close().

00167 {
00168     int  err;
00169     struct sockaddr_in sv_addr;
00170  
00171     if (sofd<=0) return sofd;
00172 
00173     memset(&sv_addr, 0, sizeof(sv_addr));
00174     sv_addr.sin_family = AF_INET;
00175     sv_addr.sin_port   = htons(port);
00176     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00177 
00178     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00179     if (err<0) {
00180         socket_close(sofd);
00181         return -3;
00182     }
00183 
00184     return sofd;
00185 }

Here is the call graph for this function:

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

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

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

Parameters:
sofd バインドするソケットの記述子.
port ポート番号
opt オプションの種類
optval オプションデータ
optlen optval の長さ
Return values:
0以上 作成されたソケット記述子.
-2 ソケットオプションの設定に失敗
-3 バインドに失敗.

Definition at line 203 of file network4.c.

References socket_close().

00204 {
00205     int  err;
00206     struct sockaddr_in sv_addr;
00207  
00208     if (sofd<=0) return sofd;
00209 
00210     memset(&sv_addr, 0, sizeof(sv_addr));
00211     sv_addr.sin_family = AF_INET;
00212     sv_addr.sin_port   = htons(port);
00213     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00214 
00215     if (opt>0) {
00216         #ifdef WIN32
00217             err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00218         #else
00219             err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00220         #endif
00221         if (err<0) {
00222             socket_close(sofd);
00223             return -2;
00224         } 
00225     }
00226 
00227     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00228     if (err<0) {
00229         socket_close(sofd);
00230         return -3;
00231     }
00232 
00233     return sofd;
00234 }

Here is the call graph for this function:

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

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

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

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

Parameters:
hostname サーバ名
port サーバポート番号
sv_addr sockaddr_in 構造体へのポインタ
Return values:
0以上 作成されたソケット記述子.
-1 ソケットが作成できなかった.
-4 サーバ情報の取得に失敗.

Definition at line 132 of file network4.c.

References socket_close().

00133 {
00134     int  sofd;
00135     struct hostent* shost;
00136  
00137     sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00138     if (sofd<0) return -1;
00139 
00140     shost = gethostbyname(hostname); 
00141     if (shost==NULL) {
00142         socket_close(sofd);
00143         return -4
00144     }
00145 
00146     memset(sv_addr, 0, sizeof(*sv_addr));
00147     sv_addr->sin_family = AF_INET;
00148     sv_addr->sin_port   = htons(port);
00149     memcpy(&(sv_addr->sin_addr), shost->h_addr, shost->h_length);
00150    
00151     return sofd;
00152 }

Here is the call graph for this function:

void udp_hole_punching ( int  sock,
struct sockaddr_in  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 1970 of file network4.c.

References LBUF, and udp_send().

01971 {
01972     char data[LBUF];
01973 
01974     if (nm<=0) nm = 4;                // for SLVoice
01975     else if (nm>LBUF) nm = LBUF;
01976 
01977     memset(data, 0, nm);
01978     udp_send(sock, data, nm, &addr);
01979 
01980     return;
01981 }

Here is the call graph for this function:

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

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

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

Parameters:
sock ソケット記述子
rmsg 受信用データバッファ
size データバッファのサイズ
sv_addr サーバの情報が格納された sockaddr_in 構造体へのポインタ.
Return values:
1以上 受信したバイト数.
0 正常切断.
-1 失敗

Definition at line 730 of file network4.c.

00731 {
00732     int cc;
00733      socklen_t cadlen;
00734 
00735     cadlen = sizeof(*sv_addr);
00736     memset(rmsg, 0, size);
00737     cc = recvfrom(sock, rmsg, size, 0, (struct sockaddr*)sv_addr, &cadlen);
00738 
00739     return cc;
00740 }

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

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

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

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

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

Definition at line 843 of file network4.c.

References RECV_TIMEOUTED, recv_wait(), and udp_recv().

00844 {
00845     int  cc;
00846 
00847     if (recv_wait(sock, tm)) {
00848         cc = udp_recv(sock, rmsg, size, sv_addr); 
00849     }
00850     else {
00851         return RECV_TIMEOUTED;
00852     }
00853     return cc;
00854 }

Here is the call graph for this function:

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

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

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

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

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

Definition at line 760 of file network4.c.

00761 {
00762     int cc;
00763 
00764     if (size<=0) size = (int)strlen(smsg);
00765 //    hton_ar(smsg, size);
00766     cc = sendto(sock, smsg, size, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00767 
00768     return cc;
00769 }

int udp_server_socket ( int  port  ) 

int udp_server_socket(int port)

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

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

Parameters:
port ポート番号
Return values:
0以上 作成されたソケット記述子.
-1 ソケットが作成できなかった.
-3 バインドに失敗.

Definition at line 31 of file network4.c.

References socket_close().

00032 {
00033     int  sofd, err;
00034     struct sockaddr_in sv_addr;
00035  
00036     sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00037     if (sofd<0) return -1;
00038  
00039     memset(&sv_addr, 0, sizeof(sv_addr));
00040     sv_addr.sin_family = AF_INET;
00041     sv_addr.sin_port   = htons(port);
00042     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00043 
00044     // TIME_WAIT しない設定.
00045 /*    struct linger lg;
00046     lg.l_onoff  = 1;
00047     lg.l_linger = 0;
00048     err = setsockopt(sofd, SOL_SOCKET, SO_LINGER, &lg, sizeof(lg));
00049     if (err<0) {
00050         socket_close(sofd);
00051         return -2;
00052     } 
00053 */
00054     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00055     if (err<0) {
00056         socket_close(sofd);
00057         return -3;
00058     }
00059 
00060     return sofd;
00061 }

Here is the call graph for this function:

int udp_server_socket_setopt ( int  port,
int  opt,
const void *  optval,
int  optlen 
)

int udp_server_socket_setopt(int port, int opt, const void* optval, int optlen)

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

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

Parameters:
port ポート番号
opt オプションの種類
optval オプションデータ
optlen optval の長さ
Return values:
0以上 作成されたソケット記述子.
-1 ソケットが作成できなかった.
-2 ソケットオプションの設定に失敗.
-3 バインドに失敗.

Definition at line 81 of file network4.c.

References socket_close().

00082 {
00083     int  sofd, err;
00084     struct sockaddr_in sv_addr;
00085  
00086     sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00087     if (sofd<0) return -1;
00088  
00089     memset(&sv_addr, 0, sizeof(sv_addr));
00090     sv_addr.sin_family = AF_INET;
00091     sv_addr.sin_port   = htons(port);
00092     sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00093 
00094     if (opt>0) {
00095         #ifdef WIN32
00096             err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00097         #else
00098             err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00099         #endif
00100         if (err<0) {
00101             socket_close(sofd);
00102             return -2;
00103         } 
00104     }
00105 
00106     err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00107     if (err<0) {
00108         socket_close(sofd);
00109         return -3;
00110     }
00111 
00112     return sofd;
00113 }

Here is the call graph for this function:


Generated on 15 Nov 2023 for JunkBox_Lib by  doxygen 1.6.1