JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
network4.h File Reference
#include "tools.h"
#include <sys/socket.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
Include dependency graph for network4.h:

Go to the source code of this file.

Macros

#define _WINSOCK_DEPRECATED_NO_WARNINGS
 
#define SEND_TIMEOUTED   -97
 
#define RECV_TIMEOUTED   -98
 
#define TRANS_TIMEOUTED   -99
 
#define MAXIFNO   10
 取り扱うネットワークインターフェイスの最大数
 
#define udp_send_mesg(sock, smsg, sv_addr)   udp_send((sock), (smsg), 0, (sv_addr))
 
#define tcp_send_mesg(sock, smsg)   tcp_send((sock), (smsg), 0)
 
#define get_localip()   get_localip_bydest("202.26.158.1")
 自分の IPアドレス(文字列)
 

Functions

int init_network (void)
 
void cleanup_network (void)
 
int udp_server_socket (int)
 call socket(), bind()
 
int udp_server_socket_setopt (int, int, const void *, int)
 call socket(), setsockopt(), bind()
 
int udp_client_socket (char *, int, struct sockaddr_in *)
 call socket()
 
int udp_bind (int, int)
 call bind()
 
int udp_bind_setopt (int, int, int, const void *, int)
 call setsockopt(), bind()
 
int tcp_server_socket (int port)
 call socket(), bind(), listen()
 
int tcp_server_socket_setopt (int port, int, const void *, int)
 call socket(), setsockopt(), bind(), listen()
 
int tcp_server_bind (int port)
 call socket(), bind()
 
int tcp_server_bind_setopt (int port, int, const void *, int)
 call socket(), setsockopt(), bind()
 
int tcp_client_socket (char *hname, int port)
 call socket(), connect()
 
int tcp_client_bind_socket (char *host, int sport, int cport)
 call socket(), bind(), connect()
 
int tcp_bind (int, int)
 call bind()
 
int tcp_bind_setopt (int, int, int, const void *, int)
 call setsockopt(), bind()
 
int tcp_connect (int sock, char *host, int port)
 call connect()
 
int accept_intr (int, struct sockaddr *, socklen_t *)
 call accept()
 
int socket_close (int sock)
 call shutdown(), close()
 
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 *hostname, unsigned short sport, unsigned short *cport)
 
int udp_recv (int, char *, int, struct sockaddr_in *)
 
int udp_send (int, char *, int, struct sockaddr_in *)
 
int tcp_recv (int, char *, int)
 
int tcp_send (int, char *, int)
 
int tcp_recv_wait (int sock, char *data, int sz, int tm)
 
int udp_recv_wait (int sock, char *data, int size, struct sockaddr_in *sv_addr, int tm)
 
int tcp_send_mesgln (int, char *)
 
int tcp_recv_mstream (int sock, char *mesg, int sz, mstream *sb, int tm)
 
int recv_wait (int sock, int tm)
 
int recv_wait_twin (int sock1, int sock2, int tm)
 
int send_wait (int sock, int tm)
 
void udp_hole_punching (int sock, struct sockaddr_in addr, int nm)
 
char * get_ipaddr (struct in_addr)
 構造体  → IPv4アドレス(文字列)
 
char * get_ipaddr_byname (char *)
 ホスト名 → IPv4アドレス(文字列) 
 
char * get_mynetaddr (void)
 自分の IPv4ネットワークアドレス(文字列)
 
char * get_localip_bydest (char *dest)
 自分の IPv4アドレス(文字列)
 
char * get_hostname_bynum (unsigned char *)
 IPv4アドレス(数字) → ホスト名(文字列)
 
char * get_hostname (char *)
 IPv4アドレス(文字列)→ ホスト名(文字列)
 
unsigned char * get_ipaddr_num (struct in_addr)
 構造体  → IPv4アドレス(数字4byte)
 
unsigned char * get_ipaddr_byname_num (char *)
 ホスト名 → IPv4アドレス(数字4byte)
 
unsigned char * get_mynetaddr_num (void)
 自分の IPv4ネットワークアドレス(数字)
 
char * get_myipaddr (void)
 自分の [IPアドレス]/[ネットマスク](文字列)
 
unsigned char * get_myipaddr_num (void)
 自分の [IPアドレス],[ネットマスク](数字)
 
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)
 
unsigned char * to_address_num8 (char *addr, int mode)
 IPアドレス(文字列)→ [IPアドレス],[ネットマスク](数字8byte)
 
char * to_address_char8 (unsigned char *addr)
 [IPアドレス],[ネットマスク](数字8byte)→ IPアドレス(文字列)
 
unsigned char * to_address_num4 (char *addr, int mode)
 IPアドレス(文字列)→ [IPアドレス](数字4byte)
 
char * to_address_char4 (unsigned char *addr)
 [IPアドレス](数字4byte)→ IPアドレス(文字列)
 
int is_same_network_num (unsigned char *addr1, unsigned char *addr2, unsigned char *mask)
 
int is_same_network (char *addr1, char *addr2, char *mask)
 

Macro Definition Documentation

◆ _WINSOCK_DEPRECATED_NO_WARNINGS

#define _WINSOCK_DEPRECATED_NO_WARNINGS

Definition at line 16 of file network4.h.

◆ get_localip

#define get_localip ( )    get_localip_bydest("202.26.158.1")

char* get_localip(void)

自分自身の IPアドレスを得るもう一つの方法.
リモートマシンに接続(ダミー)を試み,そのインターフェイス情報を獲得する.

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

Definition at line 171 of file network4.h.

◆ MAXIFNO

#define MAXIFNO   10

Definition at line 64 of file network4.h.

Referenced by get_myipaddr_num().

◆ RECV_TIMEOUTED

#define RECV_TIMEOUTED   -98

Definition at line 59 of file network4.h.

Referenced by tcp_recv_wait(), and udp_recv_wait().

◆ SEND_TIMEOUTED

#define SEND_TIMEOUTED   -97

Definition at line 58 of file network4.h.

◆ tcp_send_mesg

#define tcp_send_mesg ( sock,
smsg )   tcp_send((sock), (smsg), 0)

int tcp_send_mesg(int sock, char* smsg)

TCP経由でメッセージ(文字列)を送信する.

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

Definition at line 145 of file network4.h.

◆ TRANS_TIMEOUTED

#define TRANS_TIMEOUTED   -99

Definition at line 60 of file network4.h.

◆ udp_send_mesg

#define udp_send_mesg ( sock,
smsg,
sv_addr )   udp_send((sock), (smsg), 0, (sv_addr))

int udp_send_mesg(int sock, char* smsg, struct sockaddr_in* sv_addr)

UDPで文字列データを送る.

Parameters
sockソケット記述子
smsg送信するデータ
sv_addrサーバの情報を格納する sockaddar_in 構造体へのポインタ.
Return values
0以上送信したバイト数.
-1失敗.

Definition at line 133 of file network4.h.

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 995 of file network.c.

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

◆ cleanup_network()

void cleanup_network ( void )

Definition at line 40 of file network.c.

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

◆ get_hostname()

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 1477 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}

◆ 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 ( )

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().

Referenced by get_myipaddr_num().

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

◆ get_myipaddr_num()

unsigned char * get_myipaddr_num ( )

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_myipaddr(), get_mynetaddr_num(), and get_mynetaddr_num().

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

◆ get_mynetaddr()

char * get_mynetaddr ( )

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 ( )

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}

References get_myipaddr_num().

Referenced by get_mynetaddr(), and get_mynetaddr().

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

◆ get_sockaddr()

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

Definition at line 1442 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 1464 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 * hostname,
unsigned short sport,
unsigned short * cport )

Definition at line 1124 of file network.c.

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

References tcp_client_bind_socket.

◆ get_valid_tcp_server_socket()

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

Definition at line 1102 of file network.c.

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

References tcp_server_socket.

◆ get_valid_udp_socket()

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

Definition at line 1078 of file network.c.

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

References udp_server_socket.

◆ init_network()

int init_network ( void )

Definition at line 26 of file network.c.

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

◆ is_same_network()

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

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

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

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

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 2283 of file network.c.

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

References FALSE, freeNull, is_same_network_num(), is_same_network_num(), to_address_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タイムアウトした.

int recv_wait(int sock, int tm)

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

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

Definition at line 1443 of file network.c.

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

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

Here is the caller graph for this function:

◆ recv_wait_twin()

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

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

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

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

Definition at line 1480 of file network.c.

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

References Max.

◆ send_wait()

int send_wait ( int sock,
int tm )

int send_wait(int sock, int tm)

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

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

int send_wait(int sock, int tm)

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

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

Definition at line 1518 of file network.c.

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

◆ socket_close()

int socket_close ( int sofd)

int socket_close(int sofd)

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

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

Definition at line 1022 of file network.c.

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

Referenced by _get_localip_bydest(), _tcp_bind(), _tcp_bind_setopt(), _tcp_client_bind_socket(), _tcp_client_socket(), _tcp_connect(), _tcp_server_bind(), _tcp_server_bind_setopt(), _tcp_server_socket(), _tcp_server_socket_setopt(), _udp_bind(), _udp_bind_setopt(), _udp_server_socket(), _udp_server_socket_setopt(), check_auth(), get_localip_bydest(), get_myipaddr_num(), get_valid_rtp_pair_sockets(), simple_web_proxy(), 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_client_socket_sockaddr_in(), 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().

Here is the call 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 sock,
char * host,
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正常切断.
JBXL_NET_RECV_ERROR失敗

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

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

Parameters
sockソケット記述子
rmsg受信用データバッファ
sizeデータバッファのサイズ
Return values
1以上受信したバイト数.
0正常切断.
-1失敗

Definition at line 1226 of file network.c.

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

References JBXL_NET_RECV_ERROR.

◆ tcp_recv_mstream()

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

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

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

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

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

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

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 1395 of file network.c.

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

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

Here is the call graph for this function:

◆ tcp_recv_wait()

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

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

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

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

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

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 1317 of file network.c.

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

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

Referenced by tcp_recv_Buffer_wait(), and tcp_recv_mstream().

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

◆ tcp_send()

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

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

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

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

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

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 1252 of file network.c.

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

References JBXL_NET_SEND_ERROR.

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

Here is the caller graph for this function:

◆ tcp_send_mesgln()

int tcp_send_mesgln ( int sock,
char * mesg )

int tcp_send_mesgln(int sock, char* mesg)

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

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

int tcp_send_mesgln(int sock, char* mesg)

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

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

Definition at line 1345 of file network.c.

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

References buf, and JBXL_NET_SEND_ERROR.

◆ 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().

Here is the call graph for this function:

◆ tcp_server_socket_setopt()

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

int 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
int recv_wait(int sock, int tm)
Definition network4.c:1842
#define RECV_TIMEOUTED
Definition network4.h:59

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().

Here is the call graph for this function:

◆ udp_server_socket_setopt()

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

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: