JunkBox_Lib  1.10.2
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() More...
 
int udp_server_socket_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind() More...
 
int udp_client_socket (char *hostname, int port, struct sockaddr_in *sv_addr)
 call socket() More...
 
int udp_bind (int sofd, int port)
 call bind() More...
 
int udp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen)
 call setsockopt(), bind() More...
 
int tcp_server_socket (int port)
 call socket(), bind(), listen() More...
 
int tcp_server_socket_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind(), listen() More...
 
int tcp_server_bind (int port)
 call socket(), bind() More...
 
int tcp_server_bind_setopt (int port, int opt, const void *optval, int optlen)
 call socket(), setsockopt(), bind() More...
 
int tcp_client_socket (char *hostname, int port)
 call socket(), connect() More...
 
int tcp_client_bind_socket (char *hostname, int sport, int cport)
 call socket(), bind(), connect() More...
 
int tcp_bind (int sofd, int port)
 call bind() More...
 
int tcp_bind_setopt (int sofd, int port, int opt, const void *optval, int optlen)
 call setsockopt(), bind() More...
 
int accept_intr (int sock, struct sockaddr *cl_addr, socklen_t *cdlen)
 call accept() More...
 
int tcp_connect (int sofd, char *hostname, int port)
 call connect() More...
 
int socket_close (int sofd)
 call shutdown(), close() More...
 
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アドレス(数字) → ホスト名(文字列) More...
 
char * get_hostname (char *ipaddr)
 IPv4アドレス(文字列)→ ホスト名(文字列) More...
 
unsigned char * get_myipaddr_num ()
 自分の [IPアドレス],[ネットマスク](数字) More...
 
char * get_myipaddr ()
 自分の [IPアドレス]/[ネットマスク](文字列) More...
 
char * get_localip_bydest (char *dest)
 自分の IPv4アドレス(文字列) More...
 
char * get_ipaddr (struct in_addr sin_addr)
 構造体  → IPv4アドレス(文字列) More...
 
unsigned char * get_ipaddr_num (struct in_addr sin_addr)
 構造体  → IPv4アドレス(数字4byte) More...
 
char * get_ipaddr_byname (char *hostname)
 ホスト名 → IPv4アドレス(文字列)  More...
 
unsigned char * get_ipaddr_byname_num (char *hostname)
 ホスト名 → IPv4アドレス(数字4byte) More...
 
char * get_mynetaddr ()
 自分の IPv4ネットワークアドレス(文字列) More...
 
unsigned char * get_mynetaddr_num ()
 自分の IPv4ネットワークアドレス(数字) More...
 
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) More...
 
char * to_address_char8 (unsigned char *n)
 [IPアドレス],[ネットマスク](数字8byte)→ IPアドレス(文字列) More...
 
unsigned char * to_address_num4 (char *addr, int mode)
 IPアドレス(文字列)→ [IPアドレス](数字4byte) More...
 
char * to_address_char4 (unsigned char *n)
 [IPアドレス](数字4byte)→ IPアドレス(文字列) More...
 
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 (for IPv4/IPv6) をご覧ください.

Definition in file network4.c.

Function Documentation

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

628 {
629  int nsofd = 0;
630 
631  do {
632  nsofd = (int)accept(sock, cl_addr, cdlen);
633  } while (nsofd==-1 && errno==EINTR);
634 
635  //if (nsofd<0) Error("accept_intr");
636 
637  return nsofd;
638 }

◆ cleanup_network()

void cleanup_network ( void  )

Definition at line 2044 of file network4.c.

2045 {
2046 #ifdef WIN32
2047  WSACleanup();
2048 #endif
2049 }

◆ get_hostname()

char* get_hostname ( char *  ipaddr)

char* get_hostname(char* ipaddr)

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

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

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

Definition at line 1026 of file network4.c.

1027 {
1028  char* name;
1029  unsigned char* num;
1030 
1031  num = to_address_num4(ipaddr, 1);
1032  if (num==NULL) return NULL;
1033 
1034  name = get_hostname_bynum(num);
1035  free(num);
1036 
1037  return name;
1038 }
unsigned char * to_address_num4(char *addr, int mode)
IPアドレス(文字列)→ [IPアドレス](数字4byte)
Definition: network4.c:1756
char * get_hostname_bynum(unsigned char *num)
IPv4アドレス(数字) → ホスト名(文字列)
Definition: network4.c:990

References get_hostname_bynum(), and to_address_num4().

Here is the call graph for this function:

◆ get_hostname_bynum()

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

991 {
992  int len;
993  char* hname;
994  struct hostent* hent;
995 
996  #ifdef WIN32
997  hent = gethostbyaddr((const char*)num, 4, AF_INET);
998  #else
999  hent = gethostbyaddr(num, 4, AF_INET);
1000  #endif
1001 
1002  if (hent==NULL) return NULL;
1003 
1004  len = (int)strlen(hent->h_name);
1005  hname = (char*)malloc(len+1);
1006  if (hname==NULL) {
1007  free(hent);
1008  return NULL;
1009  }
1010  memcpy(hname, hent->h_name, len+1);
1011 
1012  return hname;
1013 }
unsigned char unsigned long * len
Definition: jpeg_tool.h:96

References len.

Referenced by get_hostname().

Here is the caller graph for this function:

◆ get_ipaddr()

char* get_ipaddr ( struct in_addr  sin_addr)

char* get_ipaddr(struct in_addr sin_addr)

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

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

Definition at line 1278 of file network4.c.

1279 {
1280  char* ip;
1281  unsigned char* pp;
1282 
1283  pp = (unsigned char*)&(sin_addr);
1284  if (pp[0]==0) return NULL;
1285 
1286  ip = (char*)malloc(16);
1287  if (ip==NULL) return NULL;
1288  memset(ip, 0, 16);
1289 
1290  snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
1291 
1292  return ip;
1293 }

Referenced by get_localip_bydest().

Here is the caller graph for this function:

◆ get_ipaddr_byname()

char* get_ipaddr_byname ( char *  hostname)

char* get_ipaddr_byname(char* hostname)

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

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

Definition at line 1333 of file network4.c.

1334 {
1335  struct hostent *host;
1336  char* ip;
1337  unsigned char* pp;
1338 
1339  host = gethostbyname(hostname);
1340  if (host==NULL) return NULL;
1341 
1342  ip = (char*)malloc(16);
1343  if (ip==NULL) return NULL;
1344  memset(ip, 0, 16);
1345 
1346  pp = (unsigned char*)(host->h_addr);
1347  snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
1348 
1349  return ip;
1350 }

Referenced by get_localip_bydest().

Here is the caller graph for this function:

◆ get_ipaddr_byname_num()

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

1362 {
1363  struct hostent *host;
1364  unsigned char* ip;
1365  unsigned char* pp;
1366 
1367  host = gethostbyname(hostname);
1368  if (host==NULL) return NULL;
1369  ip = (unsigned char*)malloc(4);
1370  if (ip==NULL) return NULL;
1371 
1372  pp = (unsigned char*)(host->h_addr);
1373  memcpy(ip, pp, 4);
1374 
1375  return ip;
1376 }

Referenced by to_address_num4(), and to_address_num8().

Here is the caller graph for this function:

◆ get_ipaddr_num()

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

1311 {
1312  unsigned char* ip;
1313  unsigned char* pp;
1314 
1315  ip = (unsigned char*)malloc(4);
1316  if (ip==NULL) return NULL;
1317 
1318  pp = (unsigned char*)&(sin_addr);
1319  memcpy(ip, pp, 4);
1320 
1321  return ip;
1322 }

◆ get_local_sockaddr()

struct sockaddr_in get_local_sockaddr ( unsigned short  cport)

Definition at line 1415 of file network4.c.

1478 {
1479  struct sockaddr_in ss_addr;
1480  struct hostent *shost;
1481 
1482 
1483  // localhost の情報を ss_addrに格納
1484  shost = gethostbyname("127.0.0.1");
1485 
1486  memset(&ss_addr, 0, sizeof(ss_addr));
1487  ss_addr.sin_family = AF_INET;
1488  ss_addr.sin_port = htons(cport);
1489  memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
1490 
1491  return ss_addr;
1492 }

References get_myipaddr_num().

Here is the call graph for this function:

◆ get_localip_bydest()

char* get_localip_bydest ( char *  dest)

char* get_localip_bydest(char* dest)

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

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

Definition at line 1221 of file network4.c.

1222 {
1223  int err, sofd;
1224  socklen_t len;
1225  char* addr;
1226  char* ip;
1227  struct sockaddr_in localif;
1228  struct sockaddr_in remote;
1229 
1230  if (dest==NULL) return NULL;
1231  ip = get_ipaddr_byname(dest);
1232  if (ip ==NULL) return NULL;
1233 
1234  memset(&localif, 0, sizeof(struct sockaddr_in));
1235  memset(&remote, 0, sizeof(struct sockaddr_in));
1236  remote.sin_family = AF_INET;
1237  remote.sin_addr.s_addr = inet_addr(ip);
1238  remote.sin_port = htons(9999);
1239  free(ip);
1240 
1241  sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
1242  if (sofd<0) return NULL;
1243 
1244  err = connect(sofd, (struct sockaddr*)&remote, sizeof(remote));
1245  if (err<0) {
1246  socket_close(sofd);
1247  return NULL;
1248  }
1249 
1250  len = sizeof(localif);
1251  err = getsockname(sofd, (struct sockaddr *)&localif, &len);
1252  if (err<0) {
1253  socket_close(sofd);
1254  return NULL;
1255  }
1256  socket_close(sofd);
1257 
1258  addr = get_ipaddr(localif.sin_addr);
1259  return addr;
1260 }
int socket_close(int sofd)
call shutdown(), close()
Definition: network4.c:689
char * get_ipaddr_byname(char *hostname)
ホスト名 → IPv4アドレス(文字列) 
Definition: network4.c:1333

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

Here is the call graph for this function:

◆ get_myipaddr()

char* get_myipaddr ( void  )

char* get_myipaddr()

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

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

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

Definition at line 1188 of file network4.c.

1189 {
1190  char* addr;
1191  unsigned char* n;
1192 
1193  n = get_myipaddr_num();
1194  if (n==NULL) return NULL;
1195 
1196  addr = (char*)malloc(32);
1197  if (addr==NULL) {
1198  free(n);
1199  return NULL;
1200  }
1201  memset(addr, 0, 32);
1202 
1203  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]);
1204 
1205  free(n);
1206  return addr;
1207 }
unsigned char * get_myipaddr_num()
自分の [IPアドレス],[ネットマスク](数字)
Definition: network4.c:1092

References get_myipaddr_num().

Here is the call graph for this function:

◆ get_myipaddr_num()

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

1093 {
1094  int i, sofd, len;
1095 
1096  unsigned char* addr = NULL;
1097  struct ifconf ifc;
1098  struct ifreq* ifq;
1099  struct ifreq* ifp;
1100 
1101 
1102  len = sizeof(struct ifreq)*MAXIFNO;
1103  ifp = ifq = (struct ifreq*)malloc(len);
1104  if (ifq==NULL) return NULL;
1105  memset(ifp, 0, len);
1106  ifc.ifc_len = len;
1107  ifc.ifc_req = ifq;
1108 
1109  sofd = socket(AF_INET, SOCK_DGRAM, 0);
1110  if (sofd<0) {
1111  perror("get_myipaddr_num: socket");
1112  return NULL;
1113  }
1114 
1115 
1116  // インターフェイス名の取得
1117  if (ioctl(sofd, SIOCGIFCONF, &ifc)<0) {
1118  socket_close(sofd);
1119  free(ifq);
1120  return NULL;
1121  }
1122 
1123 
1124  ifp = ifq;
1125  for (i=0; i<MAXIFNO; i++) {
1126 
1127  // インターフェイスのフラグ取得
1128  if (ioctl(sofd, SIOCGIFFLAGS, ifp)<0) {
1129  socket_close(sofd);
1130  free(ifq);
1131  return NULL;
1132  }
1133 
1134  if ((ifp->ifr_flags&IFF_UP) && !(ifp->ifr_flags&IFF_LOOPBACK)) {
1135  int j;
1136  unsigned char* p = (unsigned char*)ifp->ifr_addr.sa_data;
1137 
1138  addr = (unsigned char*)malloc(8);
1139  if (addr==NULL) {
1140  socket_close(sofd);
1141  free(ifq);
1142  return NULL;
1143  }
1144  memset(addr, 0, 8);
1145 
1146  // アドレス取得
1147  if (ioctl(sofd, SIOCGIFADDR, ifp)<0) {
1148  socket_close(sofd);
1149  free(ifq);
1150  free(addr);
1151  return NULL;
1152  }
1153  for (j=0; j<4; j++) addr[j] = p[j+2];
1154 
1155  // ネットマスク取得
1156  if (ioctl(sofd, SIOCGIFNETMASK, ifp)<0) {
1157  socket_close(sofd);
1158  free(ifq);
1159  free(addr);
1160  return NULL;
1161  }
1162  for (j=0; j<4; j++) addr[j+4] = p[j+2];
1163 
1164  return addr;
1165  }
1166  ifp++;
1167  }
1168 
1169  socket_close(sofd);
1170  free(ifq);
1171  return NULL;
1172 }
#define MAXIFNO
取り扱うネットワークインターフェイスの最大数
Definition: network4.h:64

References len, MAXIFNO, and socket_close().

Referenced by get_local_sockaddr(), and get_myipaddr().

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

◆ get_mynetaddr()

char* get_mynetaddr ( void  )

char* get_mynetaddr()

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

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

Definition at line 1386 of file network4.c.

1387 {
1388  char* net;
1389  unsigned char* pp;
1390 
1391  pp = get_mynetaddr_num();
1392  if (pp==NULL) return NULL;
1393 
1394  net = (char*)malloc(16);
1395  if (net==NULL) {
1396  free(pp);
1397  return NULL;
1398  }
1399  memset(net, 0, 16);
1400 
1401  snprintf(net, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
1402 
1403  free(pp);
1404  return net;
1405 }
unsigned char * get_mynetaddr_num()
自分の IPv4ネットワークアドレス(数字)
Definition: network4.c:1415

References get_mynetaddr_num().

Here is the call graph for this function:

◆ get_mynetaddr_num()

unsigned char* get_mynetaddr_num ( void  )

unsigned char* get_mynetaddr_num()

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

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

Definition at line 1415 of file network4.c.

1416 {
1417  int i;
1418  unsigned char* net;
1419  unsigned char* ip;
1420  unsigned char* mk;
1421 
1422  ip = get_myipaddr_num();
1423  if (ip==NULL) return NULL;
1424  mk = &(ip[4]);
1425 
1426  net = (unsigned char*)malloc(4);
1427  if (net==NULL) {
1428  free(ip);
1429  return NULL;
1430  }
1431 
1432  for (i=0; i<4; i++) net[i] = ip[i] & mk[i];
1433 
1434  free(ip);
1435  return net;
1436 }

Referenced by get_mynetaddr().

Here is the caller graph for this function:

◆ get_sockaddr()

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

Definition at line 1415 of file network4.c.

1443 {
1444  struct sockaddr_in ss_addr;
1445  struct hostent *shost;
1446 
1447  // Serverの情報を ss_addrに格納
1448  shost = gethostbyname(hostname);
1449  if (shost==NULL) {
1450  ss_addr.sin_family = 0;
1451  ss_addr.sin_port = 0;
1452  return ss_addr;
1453  }
1454 
1455  memset(&ss_addr, 0, sizeof(ss_addr));
1456  ss_addr.sin_family = AF_INET;
1457  ss_addr.sin_port = htons(cport);
1458  memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
1459 
1460  return ss_addr;
1461 }

◆ get_sockaddr_bynum()

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

Definition at line 1415 of file network4.c.

1465 {
1466  struct sockaddr_in ss_addr;
1467 
1468  memset(&ss_addr, 0, sizeof(ss_addr));
1469  ss_addr.sin_family = AF_INET;
1470  ss_addr.sin_port = htons(cport);
1471  memcpy(&(ss_addr.sin_addr), ipnum, 4);
1472 
1473  return ss_addr;
1474 }

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

1999 {
2000  int i, sock, range;
2001 
2002  range = max - min + 1;
2003  *cport = rand()%range + min;
2004 
2005  i = 1;
2006  sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
2007  while(sock<0 && i<range) {
2008  (*cport)++;
2009  if (*cport>max) *cport = ((int)*cport)%max + min - 1;
2010  sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
2011  i++;
2012  }
2013 
2014  if (sock<=0) *cport = 0;
2015 
2016  return sock;
2017 }
int tcp_client_bind_socket(char *hostname, int sport, int cport)
call socket(), bind(), connect()
Definition: network4.c:491

References tcp_client_bind_socket().

Here is the call graph for this function:

◆ get_valid_tcp_server_socket()

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

Definition at line 1976 of file network4.c.

1977 {
1978  int i, sock, range;
1979 
1980  range = max - min + 1;
1981  *port = rand()%range + min;
1982 
1983  i = 1;
1984  sock = tcp_server_socket((int)*port);
1985  while(sock<=0 && i<range) {
1986  (*port)++;
1987  if (*port>max) *port = ((int)*port)%max + min - 1;
1988  sock = tcp_server_socket((int)*port);
1989  i++;
1990  }
1991 
1992  if (sock<=0) *port = 0;
1993 
1994  return sock;
1995 }
int tcp_server_socket(int port)
call socket(), bind(), listen()
Definition: network4.c:249

References tcp_server_socket().

Here is the call graph for this function:

◆ get_valid_udp_socket()

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

Definition at line 1954 of file network4.c.

1955 {
1956  int i, sock, range;
1957 
1958  range = max - min + 1;
1959  *port = rand()%range + min;
1960 
1961  i = 1;
1962  sock = udp_server_socket((int)*port);
1963  while(sock<=0 && i<range) {
1964  (*port)++;
1965  if (*port>max) *port = ((int)*port)%max + min - 1;
1966  sock = udp_server_socket((int)*port);
1967  i++;
1968  }
1969 
1970  if (sock<=0) *port = 0;
1971 
1972  return sock;
1973 }
int udp_server_socket(int port)
call socket(), bind()
Definition: network4.c:28

References udp_server_socket().

Here is the call graph for this function:

◆ init_network()

int init_network ( void  )

Definition at line 2031 of file network4.c.

2032 {
2033  int ret = 0;
2034 
2035 #ifdef WIN32
2036  ret = WSAStartup(MAKEWORD(2,0), &WsaData);
2037  if (ret!=0) WSACleanup();
2038 #endif
2039 
2040  return ret;
2041 }

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

Definition at line 1576 of file network4.c.

1577 {
1578  int ret;
1579  unsigned char* a1;
1580  unsigned char* a2;
1581  unsigned char* mk;
1582 
1583  if (addr1==NULL || addr2==NULL || mask==NULL) return FALSE;
1584 
1585  a1 = to_address_num4(addr1, 1);
1586  a2 = to_address_num4(addr2, 1);
1587  mk = to_address_num4(mask, 0);
1588  if (a1==NULL || a2==NULL || mk==NULL) {
1589  freeNull(a1);
1590  freeNull(a2);
1591  freeNull(mk);
1592  return FALSE;
1593  }
1594 
1595  ret = is_same_network_num(a1, a2, mk);
1596  freeNull(a1);
1597  freeNull(a2);
1598  freeNull(mk);
1599 
1600  return ret;
1601 }
#define FALSE
Definition: common.h:223
int is_same_network_num(unsigned char *addr1, unsigned char *addr2, unsigned char *mask)
Definition: network4.c:1543
#define freeNull(p)
Definition: tools.h:201

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

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

1544 {
1545  int i;
1546 
1547  if (addr1==NULL || addr2==NULL) return FALSE;
1548 
1549  if (mask==NULL) {
1550  for (i=0; i<4; i++) {
1551  if (addr1[i] != addr2[i]) return FALSE;
1552  }
1553  }
1554  else {
1555  for (i=0; i<4; i++) {
1556  if ((addr1[i]&mask[i]) != (addr2[i]&mask[i])) return FALSE;
1557  }
1558  }
1559  return TRUE;
1560 }
#define TRUE
Definition: common.h:226

References FALSE, and TRUE.

Referenced by is_same_network().

Here is the caller graph for this function:

◆ is_same_sockaddr()

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

1507 {
1508  int i, len;
1509  unsigned char *p1, *p2;
1510 
1511  p1 = (unsigned char*)&(addr1.sin_addr);
1512  p2 = (unsigned char*)&(addr2.sin_addr);
1513  len = sizeof(addr1.sin_addr);
1514 
1515  for (i=0; i<len; i++) {
1516  if (p1[i]!=p2[i]) return FALSE;
1517  }
1518 
1519  p1 = (unsigned char*)&(addr1.sin_port);
1520  p2 = (unsigned char*)&(addr2.sin_port);
1521  len = sizeof(addr1.sin_port);
1522 
1523  for (i=0; i<len; i++) {
1524  if (p1[i]!=p2[i]) return FALSE;
1525  }
1526 
1527  return TRUE;
1528 }

References FALSE, len, and TRUE.

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

1843 {
1844  int nd;
1845  fd_set mask;
1846  struct timeval timeout;
1847  time_t otm, ntm;
1848 
1849  otm = time(NULL);
1850  do {
1851  timeout.tv_sec = tm;
1852  timeout.tv_usec = 0;
1853  FD_ZERO(&mask);
1854  FD_SET(sock, &mask);
1855 
1856  //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
1857  nd = select(sock+1, &mask, NULL, NULL, &timeout);
1858  ntm = time(NULL);
1859  } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
1860 
1861  return FD_ISSET(sock, &mask);
1862 }

Referenced by tcp_recv_wait(), and udp_recv_wait().

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

1866 {
1867  int ret = 0;
1868  int nm, nd;
1869  fd_set mask;
1870  struct timeval timeout;
1871  time_t otm, ntm;
1872 
1873  nm = Max(sock1, sock2);
1874  otm = time(NULL);
1875  do {
1876  timeout.tv_sec = tm;
1877  timeout.tv_usec = 0;
1878  FD_ZERO(&mask);
1879  FD_SET(sock1, &mask);
1880  FD_SET(sock2, &mask);
1881  nd = select(nm+1, &mask, NULL, NULL, &timeout);
1882  ntm = time(NULL);
1883  } while ((nd<0 || (!FD_ISSET(sock1, &mask) && !FD_ISSET(sock2, &mask))) && (int)(ntm-otm)<=tm);
1884 
1885  if (FD_ISSET(sock1, &mask)) ret += 1;
1886  if (FD_ISSET(sock2, &mask)) ret += 2;
1887 
1888  return ret;
1889 }
#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 1903 of file network4.c.

1904 {
1905  int nd;
1906  fd_set mask;
1907  struct timeval timeout;
1908  time_t otm, ntm;
1909 
1910  otm = time(NULL);
1911  do {
1912  timeout.tv_sec = tm;
1913  timeout.tv_usec = 0;
1914  FD_ZERO(&mask);
1915  FD_SET(sock, &mask);
1916 
1917  //DEBUG_MESG("Waiting sock = %d for %ds.\n", sock, tm);
1918  nd = select(sock+1, NULL, &mask, NULL, &timeout);
1919  ntm = time(NULL);
1920  } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
1921 
1922  return FD_ISSET(sock, &mask);
1923 }

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

690 {
691  int err = -1;
692 
693  if (sofd>0) {
694  #ifdef WIN32
695  err = shutdown(sofd, 2);
696  closesocket(sofd);
697  #else
698  err = shutdown(sofd, SHUT_RDWR);
699  close(sofd);
700  #endif
701  }
702  return err;
703 }

Referenced by get_localip_bydest(), get_myipaddr_num(), tcp_bind(), tcp_bind_setopt(), tcp_client_bind_socket(), tcp_client_socket(), tcp_server_bind(), tcp_server_bind_setopt(), tcp_server_socket(), tcp_server_socket_setopt(), udp_bind(), udp_bind_setopt(), udp_client_socket(), udp_server_socket(), and udp_server_socket_setopt().

Here is the caller graph for this function:

◆ tcp_bind()

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

544 {
545  int err;
546  struct sockaddr_in sv_addr;
547 
548  if (sofd<=0) return sofd;
549 
550  memset(&sv_addr, 0, sizeof(sv_addr));
551  sv_addr.sin_family = AF_INET;
552  sv_addr.sin_port = htons(port);
553  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
554 
555  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
556  if (err<0) {
557  socket_close(sofd);
558  return -3;
559  }
560 
561  return sofd;
562 }

References 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 tcp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)

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

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

Definition at line 580 of file network4.c.

581 {
582  int err;
583  struct sockaddr_in sv_addr;
584 
585  if (sofd<=0) return sofd;
586 
587  if (opt>0) {
588  #ifdef WIN32
589  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
590  #else
591  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
592  #endif
593  if (err<0) {
594  socket_close(sofd);
595  return -2;
596  }
597  }
598 
599  memset(&sv_addr, 0, sizeof(sv_addr));
600  sv_addr.sin_family = AF_INET;
601  sv_addr.sin_port = htons(port);
602  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
603 
604  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
605  if (err<0) {
606  socket_close(sofd);
607  return -3;
608  }
609 
610  return sofd;
611 }

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

492 {
493  int sofd, err;
494  struct hostent *shost;
495  struct sockaddr_in sv_addr;
496 
497  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
498  if (sofd<0) return -1;
499 
500  memset(&sv_addr, 0, sizeof(sv_addr));
501  sv_addr.sin_family = AF_INET;
502  sv_addr.sin_port = htons(cport);
503  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
504 
505  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
506  if (err<0) {
507  socket_close(sofd);
508  return -3;
509  }
510 
511  shost = gethostbyname(hostname);
512  if (shost==NULL) {
513  socket_close(sofd);
514  return -4;
515  }
516 
517  memset(&sv_addr, 0, sizeof(sv_addr));
518  sv_addr.sin_family = AF_INET;
519  sv_addr.sin_port = htons(sport);
520  memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
521 
522  err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
523  if (err<0) {
524  socket_close(sofd);
525  return -5;
526  }
527 
528  return sofd;
529 }

References socket_close().

Referenced by get_valid_tcp_client_socket().

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

◆ tcp_client_socket()

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

445 {
446  int sofd, err;
447  struct hostent *shost;
448  struct sockaddr_in sv_addr;
449 
450  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
451  if (sofd<0) return -1;
452 
453  shost = gethostbyname(hostname);
454  if (shost==NULL) {
455  socket_close(sofd);
456  return -4;
457  }
458 
459  memset(&sv_addr, 0, sizeof(sv_addr));
460  sv_addr.sin_family = AF_INET;
461  sv_addr.sin_port = htons(port);
462  memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
463 
464  err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
465  if (err<0) {
466  socket_close(sofd);
467  return -5;
468  }
469 
470  return sofd;
471 }

References socket_close().

Here is the call graph for this function:

◆ tcp_connect()

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

Definition at line 656 of file network4.c.

657 {
658  int err;
659  struct hostent *shost;
660  struct sockaddr_in sv_addr;
661 
662  shost = gethostbyname(hostname);
663  if (shost==NULL) return -4;
664 
665  memset(&sv_addr, 0, sizeof(sv_addr));
666  sv_addr.sin_family = AF_INET;
667  sv_addr.sin_port = htons(port);
668  memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
669 
670  err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
671  if (err<0) return -5;
672  return 0;
673 }

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

Definition at line 780 of file network4.c.

781 {
782  int cc;
783 
784  memset(rmsg, 0, size);
785  cc = recv(sock, rmsg, size, 0);
786 
787  return cc;
788 }

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

943 {
944  int cc;
945  unsigned char* pp;
946 
947  if (mesg==NULL || sb==NULL) return -2;
948  memset(mesg, 0, sz);
949 
950  if (sb->buf==NULL) {
951  *sb = make_mstream(RECVBUFSZ);
952  if (sb->buf==NULL) return -3;
953  }
954 
955  while (sb->datano==0) {
956  cc = tcp_recv_wait(sock, mesg, sz, tm);
957  if (cc<=0) return cc;
958  put_mstream(sb, (unsigned char*)mesg);
959  memset(mesg, 0, sz);
960  }
961 
962  pp = get_mstream(sb);
963  if (pp==NULL) return -4;
964  if (strlen((const char*)pp)>=(unsigned int)sz) {
965  memcpy(mesg, pp, sz-1);
966  free(pp);
967  return -5;
968  }
969  memcpy(mesg, pp, strlen((const char*)pp));
970 
971  free(pp);
972  return (int)strlen(mesg);
973 }
#define RECVBUFSZ
256K
Definition: common.h:134
int tcp_recv_wait(int sock, char *mesg, int sz, int tm)
Definition: network4.c:867
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(), 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() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウトとなる (RECV_TIMEOUTED が返る).

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

Definition at line 867 of file network4.c.

868 {
869  int cc;
870 
871  if (recv_wait(sock, tm)) {
872  cc = recv(sock, mesg, sz, 0);
873  }
874  else {
875  return RECV_TIMEOUTED;
876  }
877  return cc;
878 }
int recv_wait(int sock, int tm)
Definition: network4.c:1842
#define RECV_TIMEOUTED
Definition: network4.h:59

References RECV_TIMEOUTED, and recv_wait().

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

Definition at line 805 of file network4.c.

806 {
807  int cc;
808 
809  if (size<=0) size = (int)strlen(smsg);
810  cc = send(sock, smsg, size, 0);
811 
812  return cc;
813 }

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

Definition at line 892 of file network4.c.

893 {
894  int cc, sz;
895  char* buf;
896 
897  sz = (int)strlen(mesg) + 3; /* CR+LF+0x00 */
898  buf = (char*)malloc(sz);
899  if (buf==NULL) return -1;
900 
901  strncpy(buf, mesg, sz);
902  strncat(buf, "\r\n", 2);
903 // hton_ar(buf, strlen(buf));
904  cc = send(sock, buf, (int)strlen(buf), 0);
905 
906  free(buf);
907  return cc;
908 }
unsigned char ** buf
Definition: jpeg_tool.h:96

References buf.

◆ tcp_server_bind()

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

354 {
355  int sofd, err;
356  struct sockaddr_in sv_addr;
357 
358  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
359  if (sofd<0) return -1;
360 
361  memset(&sv_addr, 0, sizeof(sv_addr));
362  sv_addr.sin_family = AF_INET;
363  sv_addr.sin_port = htons(port);
364  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
365 
366  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
367  if (err<0) {
368  socket_close(sofd);
369  return -3;
370  }
371 
372  return sofd;
373 }

References socket_close().

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 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オプションデータ
optlenoptval の長さ
Return values
0以上作成されたソケット記述子.
-1ソケットの作成に失敗.
-2ソケットオプションの設定に失敗.
-3バインドに失敗.

Definition at line 394 of file network4.c.

395 {
396  int sofd, err;
397  struct sockaddr_in sv_addr;
398 
399  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
400  if (sofd<0) return -1;
401 
402  if (opt>0) {
403  #ifdef WIN32
404  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
405  #else
406  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
407  #endif
408  if (err<0) {
409  socket_close(sofd);
410  return -2;
411  }
412  }
413 
414  memset(&sv_addr, 0, sizeof(sv_addr));
415  sv_addr.sin_family = AF_INET;
416  sv_addr.sin_port = htons(port);
417  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
418 
419  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
420  if (err<0) {
421  socket_close(sofd);
422  return -3;
423  }
424 
425  return sofd;
426 }

References socket_close().

Here is the call graph for this function:

◆ tcp_server_socket()

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

250 {
251  int sofd, err;
252  struct sockaddr_in sv_addr;
253 
254  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
255  if (sofd<0) return -1;
256 
257  memset(&sv_addr, 0, sizeof(sv_addr));
258  sv_addr.sin_family = AF_INET;
259  sv_addr.sin_port = htons(port);
260  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
261 
262  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
263  if (err<0) {
264  socket_close(sofd);
265  return -3;
266  }
267 
268  err = listen(sofd, 10);
269  if (err==-1) {
270  socket_close(sofd);
271  return -6;
272  }
273 
274  return sofd;
275 }

References socket_close().

Referenced by get_valid_tcp_server_socket().

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

◆ tcp_server_socket_setopt()

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オプションデータ
optlenoptval の長さ
Return values
0以上作成されたソケット記述子.
-1ソケットの作成に失敗.
-2ソケットオプションの設定に失敗.
-3バインドに失敗.
-6リッスンの設定に失敗.

Definition at line 298 of file network4.c.

299 {
300  int sofd, err;
301  struct sockaddr_in sv_addr;
302 
303  sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
304  if (sofd<0) return -1;
305 
306  memset(&sv_addr, 0, sizeof(sv_addr));
307  sv_addr.sin_family = AF_INET;
308  sv_addr.sin_port = htons(port);
309  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
310 
311  if (opt>0) {
312  #ifdef WIN32
313  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
314  #else
315  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
316  #endif
317  if (err<0) {
318  socket_close(sofd);
319  return -2;
320  }
321  }
322 
323  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
324  if (err<0) {
325  socket_close(sofd);
326  return -3;
327  }
328 
329  err = listen(sofd, 10);
330  if (err==-1) {
331  socket_close(sofd);
332  return -6;
333  }
334 
335  return sofd;
336 }

References socket_close().

Here is the call graph for this function:

◆ to_address_char4()

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

1817 {
1818  char* addr;
1819  if (n==NULL) return NULL;
1820 
1821  addr = (char*)malloc(16);
1822  if (addr==NULL) return NULL;
1823  memset(addr, 0, 16);
1824 
1825  snprintf(addr, 15, "%d.%d.%d.%d", n[0], n[1], n[2], n[3]);
1826 
1827  return addr;
1828 }

◆ to_address_char8()

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

1728 {
1729  char* addr;
1730  if (n==NULL) return NULL;
1731 
1732  addr = (char*)malloc(32);
1733  if (addr==NULL) return NULL;
1734  memset(addr, 0, 32);
1735 
1736  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]);
1737 
1738  return addr;
1739 }

◆ to_address_num4()

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アドレス
mode0: IPアドレス以外のもの(英字)は NULL を返す.
mode0以外: FQDNはIPアドレスに変換して返す(時間がかかる)
Returns
[IPアドレス] の長さ4byteのバイナリ.要 free

Definition at line 1756 of file network4.c.

1757 {
1758  unsigned char* num;
1759  char* pc;
1760  char* uc = NULL;
1761  int i;
1762 
1763  if (addr==NULL) return NULL;
1764 
1765  num = (unsigned char*)malloc(4);
1766  if (num==NULL) return NULL;
1767  memset(num, 0, 4);
1768 
1769  // IPアドレス部の変換
1770  i = (int)strlen(addr) - 1;
1771  while (i>0 && addr[i]=='.') i--;
1772  if (i>0) {
1773  if (isalpha(addr[i])) {
1774  if (mode==0) { // mode==0なら FQDN->IPアドレス は行なわない.
1775  free(num);
1776  return NULL;
1777  }
1778  uc = (char*)get_ipaddr_byname_num(addr);
1779  if (uc==NULL) {
1780  free(num);
1781  return NULL;
1782  }
1783  }
1784  }
1785 
1786  if (uc==NULL) { // IPアドレス表記の処理
1787  for (i=0; i<4; i++) {
1788  pc = awk(addr, '.', i+1);
1789  if (pc==NULL) break;
1790  num[i] = (unsigned char)atoi(pc);
1791  free(pc);
1792  }
1793  }
1794  else { // ホスト名表記の処理
1795  for (i=0; i<4; i++) num[i] = uc[i];
1796  free(uc);
1797  }
1798 
1799  return num;
1800 }
unsigned char * get_ipaddr_byname_num(char *hostname)
ホスト名 → IPv4アドレス(数字4byte)
Definition: network4.c:1361
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition: tools.c:567

References awk(), and get_ipaddr_byname_num().

Referenced by get_hostname(), and is_same_network().

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

◆ to_address_num8()

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

Definition at line 1620 of file network4.c.

1621 {
1622  unsigned char* num;
1623  char* ps;
1624  char* pc;
1625  char* uc = NULL;
1626  int i;
1627 
1628  if (addr==NULL) return NULL;
1629 
1630  num = (unsigned char*)malloc(8);
1631  if (num==NULL) return NULL;
1632  memset(num, 0, 8);
1633 
1634 
1635  // IPアドレス部の変換
1636  ps = awk(addr, '/', 1);
1637  if (ps==NULL) {
1638  free(num);
1639  return NULL;
1640  }
1641 
1642  i = (int)strlen(ps) - 1;
1643  while (i>0 && ps[i]=='.') i--;
1644  if (i>0) {
1645  if (isalpha(ps[i])) {
1646  if (mode==0) { // mode==0なら FQDN->IPアドレス は行なわない.
1647  free(num);
1648  free(ps);
1649  return NULL;
1650  }
1651  uc = (char*)get_ipaddr_byname_num(ps);
1652  if (uc==NULL) {
1653  free(num);
1654  free(ps);
1655  return NULL;
1656  }
1657  }
1658  }
1659 
1660  if (uc==NULL) { // IPアドレス表記の処理
1661  for (i=0; i<4; i++) {
1662  pc = awk(ps, '.', i+1);
1663  if (pc==NULL) break;
1664  num[i] = (unsigned char)atoi(pc);
1665  free(pc);
1666  }
1667  }
1668  else { // ホスト名表記の処理
1669  for (i=0; i<4; i++) num[i] = uc[i];
1670  free(uc);
1671  }
1672  free(ps);
1673 
1674  ps = awk(addr, '/', 2);
1675 
1676  // サブネットマスク部が省略された場合の処理
1677  if (ps==NULL) {
1678  int f = OFF;
1679  for (i=3; i>=0; i--) {
1680  if (num[i]!=0 || f==ON) {
1681  num[i+4] = 0xff;
1682  f = ON;
1683  }
1684  else {
1685  num[i+4] = 0;
1686  }
1687  }
1688  return num;
1689  }
1690 
1691  // サブネットマスク部の処理
1692  for (i=0; i<4; i++) {
1693  pc = awk(ps, '.', i+1);
1694  if (pc==NULL) break;
1695  num[i+4] = (unsigned char)atoi(pc);
1696  free(pc);
1697  }
1698  free(ps);
1699 
1700  // CIDER形式対応
1701  if (num[4]<=32 && num[5]==0 && num[6]==0 && num[7]==0) {
1702  int nn, cl = (int)num[4];
1703  for (i=0; i<4; i++) {
1704  nn = 8 - Max(0, Min(8, cl-8*i));
1705  num[i+4] = 0xff<<nn;
1706  }
1707  }
1708 
1709  return num;
1710 }
#define Min(x, y)
Definition: common.h:250
#define OFF
Definition: common.h:231
#define ON
Definition: common.h:230

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

Here is the call graph for this function:

◆ udp_bind()

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

164 {
165  int err;
166  struct sockaddr_in sv_addr;
167 
168  if (sofd<=0) return sofd;
169 
170  memset(&sv_addr, 0, sizeof(sv_addr));
171  sv_addr.sin_family = AF_INET;
172  sv_addr.sin_port = htons(port);
173  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
174 
175  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
176  if (err<0) {
177  socket_close(sofd);
178  return -3;
179  }
180 
181  return sofd;
182 }

References 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 udp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)

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

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

Definition at line 200 of file network4.c.

201 {
202  int err;
203  struct sockaddr_in sv_addr;
204 
205  if (sofd<=0) return sofd;
206 
207  memset(&sv_addr, 0, sizeof(sv_addr));
208  sv_addr.sin_family = AF_INET;
209  sv_addr.sin_port = htons(port);
210  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
211 
212  if (opt>0) {
213  #ifdef WIN32
214  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
215  #else
216  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
217  #endif
218  if (err<0) {
219  socket_close(sofd);
220  return -2;
221  }
222  }
223 
224  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
225  if (err<0) {
226  socket_close(sofd);
227  return -3;
228  }
229 
230  return sofd;
231 }

References socket_close().

Here is the call graph for this function:

◆ udp_client_socket()

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_addrsockaddr_in 構造体へのポインタ
Return values
0以上作成されたソケット記述子.
-1ソケットが作成できなかった.
-4サーバ情報の取得に失敗.

Definition at line 129 of file network4.c.

130 {
131  int sofd;
132  struct hostent* shost;
133 
134  sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
135  if (sofd<0) return -1;
136 
137  shost = gethostbyname(hostname);
138  if (shost==NULL) {
139  socket_close(sofd);
140  return -4
141  }
142 
143  memset(sv_addr, 0, sizeof(*sv_addr));
144  sv_addr->sin_family = AF_INET;
145  sv_addr->sin_port = htons(port);
146  memcpy(&(sv_addr->sin_addr), shost->h_addr, shost->h_length);
147 
148  return sofd;
149 }

References socket_close().

Here is the call graph for this function:

◆ udp_hole_punching()

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

1936 {
1937  char data[LBUF];
1938 
1939  if (nm<=0) nm = 4; // for SLVoice
1940  else if (nm>LBUF) nm = LBUF;
1941 
1942  memset(data, 0, nm);
1943  udp_send(sock, data, nm, &addr);
1944 
1945  return;
1946 }
#define LBUF
Definition: common.h:146
int udp_send(int sock, char *smsg, int size, struct sockaddr_in *sv_addr)
Definition: network4.c:755

References LBUF, and udp_send().

Here is the call graph for this function:

◆ udp_recv()

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

727 {
728  int cc;
729  socklen_t cadlen;
730 
731  cadlen = sizeof(*sv_addr);
732  memset(rmsg, 0, size);
733  cc = recvfrom(sock, rmsg, size, 0, (struct sockaddr*)sv_addr, &cadlen);
734 
735  return cc;
736 }

Referenced by udp_recv_wait().

Here is the caller graph for this function:

◆ udp_recv_wait()

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

836 {
837  int cc;
838 
839  if (recv_wait(sock, tm)) {
840  cc = udp_recv(sock, rmsg, size, sv_addr);
841  }
842  else {
843  return RECV_TIMEOUTED;
844  }
845  return cc;
846 }
int udp_recv(int sock, char *rmsg, int size, struct sockaddr_in *sv_addr)
Definition: network4.c:726

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

Here is the call graph for this function:

◆ udp_send()

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

756 {
757  int cc;
758 
759  if (size<=0) size = (int)strlen(smsg);
760 // hton_ar(smsg, size);
761  cc = sendto(sock, smsg, size, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
762 
763  return cc;
764 }

Referenced by udp_hole_punching().

Here is the caller graph for this function:

◆ udp_server_socket()

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

29 {
30  int sofd, err;
31  struct sockaddr_in sv_addr;
32 
33  sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
34  if (sofd<0) return -1;
35 
36  memset(&sv_addr, 0, sizeof(sv_addr));
37  sv_addr.sin_family = AF_INET;
38  sv_addr.sin_port = htons(port);
39  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
40 
41  // TIME_WAIT しない設定.
42 /* struct linger lg;
43  lg.l_onoff = 1;
44  lg.l_linger = 0;
45  err = setsockopt(sofd, SOL_SOCKET, SO_LINGER, &lg, sizeof(lg));
46  if (err<0) {
47  socket_close(sofd);
48  return -2;
49  }
50 */
51  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
52  if (err<0) {
53  socket_close(sofd);
54  return -3;
55  }
56 
57  return sofd;
58 }

References socket_close().

Referenced by get_valid_udp_socket().

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

◆ udp_server_socket_setopt()

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オプションデータ
optlenoptval の長さ
Return values
0以上作成されたソケット記述子.
-1ソケットが作成できなかった.
-2ソケットオプションの設定に失敗.
-3バインドに失敗.

Definition at line 78 of file network4.c.

79 {
80  int sofd, err;
81  struct sockaddr_in sv_addr;
82 
83  sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
84  if (sofd<0) return -1;
85 
86  memset(&sv_addr, 0, sizeof(sv_addr));
87  sv_addr.sin_family = AF_INET;
88  sv_addr.sin_port = htons(port);
89  sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
90 
91  if (opt>0) {
92  #ifdef WIN32
93  err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
94  #else
95  err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
96  #endif
97  if (err<0) {
98  socket_close(sofd);
99  return -2;
100  }
101  }
102 
103  err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
104  if (err<0) {
105  socket_close(sofd);
106  return -3;
107  }
108 
109  return sofd;
110 }

References socket_close().

Here is the call graph for this function: