JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
network4.c
Go to the documentation of this file.
1
11#include "network.h"
12#include <time.h>
13
14
28int udp_server_socket(int port)
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}
59
60
78int udp_server_socket_setopt(int port, int opt, const void* optval, int optlen)
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}
111
112
129int udp_client_socket(char* hostname, int port, struct sockaddr_in* sv_addr)
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}
150
151
163int udp_bind(int sofd, int port)
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}
183
184
200int udp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)
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}
232
233
249int tcp_server_socket(int port)
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}
276
277
298int tcp_server_socket_setopt(int port, int opt, const void* optval, int optlen)
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}
337
338
353int tcp_server_bind(int port)
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}
374
375
394int tcp_server_bind_setopt(int port, int opt, const void* optval, int optlen)
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}
427
428
444int tcp_client_socket(char* hostname, int port)
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}
472
473
491int tcp_client_bind_socket(char* hostname, int sport, int cport)
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}
530
531
543int tcp_bind(int sofd, int port)
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}
563
564
580int tcp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)
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}
612
613
627int accept_intr(int sock, struct sockaddr* cl_addr, socklen_t* cdlen)
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}
639
640
641/*
642int tcp_connect(int sofd, char* hostname, int port)
643
644TCPのクライアントソケットを通して,サーバに接続する.
645
646この関数内で呼び出される関数: gethostbyname(), connect()
647
648@param sofd ソケット記述子
649@param hostname サーバ名
650@param port サーバポート番号
651
652@retval 0 成功
653@retval -4 サーバ情報の取得に失敗.
654@retval -5 サーバへの接続に失敗.
655 */
656int tcp_connect(int sofd, char* hostname, int port)
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}
674
675
689int socket_close(int sofd)
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}
704
705
706
708//
709//
710//
711
726int udp_recv(int sock, char* rmsg, int size, struct sockaddr_in* sv_addr)
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}
737
738
755int udp_send(int sock, char* smsg, int size, struct sockaddr_in* sv_addr)
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}
765
766
780int tcp_recv(int sock, char* rmsg, int size)
781{
782 int cc;
783
784 memset(rmsg, 0, size);
785 cc = recv(sock, rmsg, size, 0);
786
787 return cc;
788}
789
790
805int tcp_send(int sock, char* smsg, int size)
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}
814
815
835int udp_recv_wait(int sock, char* rmsg, int size, struct sockaddr_in* sv_addr, int tm)
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}
847
848
867int tcp_recv_wait(int sock, char* mesg, int sz, int tm)
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}
879
880
892int tcp_send_mesgln(int sock, char* mesg)
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}
909
910
942int tcp_recv_mstream(int sock, char* mesg, int sz, mstream* sb, int tm)
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}
974
975
976
978//
979// アドレス処理
980//
981
990char* get_hostname_bynum(unsigned char* num)
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}
1014
1015
1026char* get_hostname(char* ipaddr)
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}
1039
1040
1041#ifdef WIN32
1042
1053unsigned char* get_myipaddr_num()
1054{
1055 unsigned char* ipnum = NULL;
1056 char* ipaddr = get_localip();
1057
1058 if (ipaddr!=NULL) {
1059 ipnum = to_address_num8(ipaddr, 0);
1060 free(ipaddr);
1061 }
1062
1063 return ipnum;
1064}
1065
1066// #define get_myipaddr() get_localip_bydest("202.26.158.1")
1067
1068#else
1069
1092unsigned char* get_myipaddr_num()
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}
1173
1174
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}
1208
1209#endif
1210
1211
1221char* get_localip_bydest(char* dest)
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}
1261
1262
1263
1278char* get_ipaddr(struct in_addr sin_addr)
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}
1294
1295
1310unsigned char* get_ipaddr_num(struct in_addr sin_addr)
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}
1323
1324
1333char* get_ipaddr_byname(char* hostname)
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}
1351
1352
1361unsigned char* get_ipaddr_byname_num(char* hostname)
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}
1377
1378
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}
1406
1407
1415unsigned char* get_mynetaddr_num()
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}
1437
1438
1442struct sockaddr_in get_sockaddr(char* hostname, unsigned short cport)
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}
1462
1463
1464struct sockaddr_in get_sockaddr_bynum(char* ipnum, unsigned short cport)
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}
1475
1476
1477struct sockaddr_in get_local_sockaddr(unsigned short cport)
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}
1493
1494
1506int is_same_sockaddr(struct sockaddr_in addr1, struct sockaddr_in addr2)
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}
1529
1530
1543int is_same_network_num(unsigned char* addr1, unsigned char* addr2, unsigned char* mask)
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}
1561
1562
1576int is_same_network(char* addr1, char* addr2, char* mask)
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}
1602
1603
1620unsigned char* to_address_num8(char* addr, int mode)
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}
1711
1712
1727char* to_address_char8(unsigned char* n)
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}
1740
1741
1756unsigned char* to_address_num4(char* addr, int mode)
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}
1801
1802
1816char* to_address_char4(unsigned char* n)
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}
1829
1830
1842int recv_wait(int sock, int tm)
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}
1863
1864
1865int recv_wait_twin(int sock1, int sock2, int tm)
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}
1890
1891
1903int send_wait(int sock, int tm)
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}
1924
1925
1935void udp_hole_punching(int sock, struct sockaddr_in addr, int nm)
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}
1947
1948
1949
1951// get_valid_..._socket
1952//
1953
1954int get_valid_udp_socket(int min, int max, unsigned short* port)
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}
1974
1975
1976int get_valid_tcp_server_socket(int min, int max, unsigned short* port)
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}
1996
1997
1998int get_valid_tcp_client_socket(int min, int max, char* hname, unsigned short sport, unsigned short* cport)
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}
2018
2019
2020
2022//
2023// for WinSock
2024//
2025
2026#ifdef WIN32
2027 WSADATA WsaData;
2028#endif
2029
2030
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}
2042
2043
2045{
2046#ifdef WIN32
2047 WSACleanup();
2048#endif
2049}
2050
#define Min(x, y)
Definition common.h:250
#define OFF
Definition common.h:231
#define Max(x, y)
Definition common.h:247
#define RECVBUFSZ
256K
Definition common.h:134
#define LBUF
Definition common.h:146
#define TRUE
Definition common.h:226
#define FALSE
Definition common.h:223
#define ON
Definition common.h:230
unsigned char ** buf
Definition jpeg_tool.h:96
unsigned char unsigned long * len
Definition jpeg_tool.h:96
int tcp_recv_wait(int sock, char *mesg, int sz, int tm)
Definition network4.c:867
int tcp_send(int sock, char *smsg, int size)
Definition network4.c:805
char * get_myipaddr()
自分の [IPアドレス]/[ネットマスク](文字列)
Definition network4.c:1188
unsigned char * get_mynetaddr_num()
自分の IPv4ネットワークアドレス(数字)
Definition network4.c:1415
int send_wait(int sock, int tm)
Definition network4.c:1903
int init_network(void)
Definition network4.c:2031
struct sockaddr_in get_local_sockaddr(unsigned short cport)
Definition network4.c:1477
unsigned char * to_address_num4(char *addr, int mode)
IPアドレス(文字列)→ [IPアドレス](数字4byte)
Definition network4.c:1756
void udp_hole_punching(int sock, struct sockaddr_in addr, int nm)
Definition network4.c:1935
char * to_address_char4(unsigned char *n)
[IPアドレス](数字4byte)→ IPアドレス(文字列)
Definition network4.c:1816
int tcp_server_socket_setopt(int port, int opt, const void *optval, int optlen)
call socket(), setsockopt(), bind(), listen()
Definition network4.c:298
int tcp_recv_mstream(int sock, char *mesg, int sz, mstream *sb, int tm)
Definition network4.c:942
int get_valid_tcp_client_socket(int min, int max, char *hname, unsigned short sport, unsigned short *cport)
Definition network4.c:1998
int socket_close(int sofd)
call shutdown(), close()
Definition network4.c:689
unsigned char * to_address_num8(char *addr, int mode)
IPアドレス(文字列)→ [IPアドレス],[ネットマスク](数字8byte)
Definition network4.c:1620
int tcp_send_mesgln(int sock, char *mesg)
Definition network4.c:892
char * get_hostname_bynum(unsigned char *num)
IPv4アドレス(数字) → ホスト名(文字列)
Definition network4.c:990
int is_same_network_num(unsigned char *addr1, unsigned char *addr2, unsigned char *mask)
Definition network4.c:1543
int get_valid_tcp_server_socket(int min, int max, unsigned short *port)
Definition network4.c:1976
int udp_recv(int sock, char *rmsg, int size, struct sockaddr_in *sv_addr)
Definition network4.c:726
struct sockaddr_in get_sockaddr(char *hostname, unsigned short cport)
Definition network4.c:1442
int accept_intr(int sock, struct sockaddr *cl_addr, socklen_t *cdlen)
call accept()
Definition network4.c:627
int tcp_recv(int sock, char *rmsg, int size)
Definition network4.c:780
unsigned char * get_ipaddr_byname_num(char *hostname)
ホスト名 → IPv4アドレス(数字4byte)
Definition network4.c:1361
unsigned char * get_ipaddr_num(struct in_addr sin_addr)
構造体  → IPv4アドレス(数字4byte)
Definition network4.c:1310
struct sockaddr_in get_sockaddr_bynum(char *ipnum, unsigned short cport)
Definition network4.c:1464
int recv_wait(int sock, int tm)
Definition network4.c:1842
char * to_address_char8(unsigned char *n)
[IPアドレス],[ネットマスク](数字8byte)→ IPアドレス(文字列)
Definition network4.c:1727
int get_valid_udp_socket(int min, int max, unsigned short *port)
Definition network4.c:1954
int is_same_network(char *addr1, char *addr2, char *mask)
Definition network4.c:1576
int is_same_sockaddr(struct sockaddr_in addr1, struct sockaddr_in addr2)
Definition network4.c:1506
char * get_ipaddr_byname(char *hostname)
ホスト名 → IPv4アドレス(文字列) 
Definition network4.c:1333
int recv_wait_twin(int sock1, int sock2, int tm)
Definition network4.c:1865
unsigned char * get_myipaddr_num()
自分の [IPアドレス],[ネットマスク](数字)
Definition network4.c:1092
char * get_mynetaddr()
自分の IPv4ネットワークアドレス(文字列)
Definition network4.c:1386
int udp_send(int sock, char *smsg, int size, struct sockaddr_in *sv_addr)
Definition network4.c:755
int udp_recv_wait(int sock, char *rmsg, int size, struct sockaddr_in *sv_addr, int tm)
Definition network4.c:835
void cleanup_network(void)
Definition network4.c:2044
char * get_ipaddr(struct in_addr sin_addr)
構造体  → IPv4アドレス(文字列)
Definition network4.c:1278
#define MAXIFNO
取り扱うネットワークインターフェイスの最大数
Definition network4.h:64
#define RECV_TIMEOUTED
Definition network4.h:59
ネットワーク用ライブラリヘッダ for IPv4/IPv6
#define udp_bind_setopt(s, p, o, v, l)
Definition network.h:98
#define get_localip_bydest(h)
Definition network.h:226
#define tcp_client_bind_socket(h, s, c)
Definition network.h:134
#define tcp_server_bind(p)
Definition network.h:116
#define tcp_bind(s, p)
Definition network.h:138
#define udp_client_socket(h, p, a)
Definition network.h:90
#define tcp_server_bind_setopt(p, o, v, l)
Definition network.h:120
#define udp_server_socket(p, a)
Definition network.h:82
#define udp_server_socket_setopt(p, o, v, l, a)
Definition network.h:86
#define udp_bind(s, p)
Definition network.h:94
#define tcp_client_socket(h, p)
Definition network.h:130
#define tcp_bind_setopt(s, p, o, v, l)
Definition network.h:142
#define tcp_server_socket(p)
Definition network.h:108
#define get_localip()
Definition network.h:230
#define get_hostname(h)
Definition network.h:198
#define tcp_connect(s, h, p)
Definition network.h:146
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition tools.c:3490
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition tools.c:567
unsigned char * get_mstream(mstream *sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
Definition tools.c:3531
#define mstream
バイト型 メッセージストリーム
Definition tools.h:167
#define freeNull(p)
Definition tools.h:201
#define make_mstream(s)
make_ringBuffer()
Definition tools.h:385