JunkBox_Lib  1.10.2
network4.c
Go to the documentation of this file.
1 
11 #include "network.h"
12 #include <time.h>
13 
14 
28 int 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 
78 int 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 
129 int 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 
163 int 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 
200 int 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 
249 int 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 
298 int 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 
353 int 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 
394 int 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 
444 int 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 
491 int 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 
543 int 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 
580 int 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 
627 int 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 /*
642 int tcp_connect(int sofd, char* hostname, int port)
643 
644 TCPのクライアントソケットを通して,サーバに接続する.
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  */
656 int 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 
689 int 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 
726 int 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 
755 int 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 
780 int 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 
805 int 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 
835 int 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 
867 int 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 
892 int 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 
942 int 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 
990 char* 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 
1026 char* 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 
1053 unsigned 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 
1092 unsigned 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 
1221 char* 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 
1278 char* 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 
1310 unsigned 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 
1333 char* 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 
1361 unsigned 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 
1415 unsigned 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 
1442 struct 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 
1464 struct 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 
1477 struct 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 
1506 int 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 
1543 int 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 
1576 int 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 
1620 unsigned 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 
1727 char* 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 
1756 unsigned 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 
1816 char* 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 
1842 int 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 
1865 int 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 
1903 int 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 
1935 void 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 
1954 int 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 
1976 int 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 
1998 int 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 
2031 int init_network(void)
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
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
int tcp_bind(int sofd, int port)
call bind()
Definition: network4.c:543
void udp_hole_punching(int sock, struct sockaddr_in addr, int nm)
Definition: network4.c:1935
char * get_ipaddr(struct in_addr sin_addr)
構造体  → IPv4アドレス(文字列)
Definition: network4.c:1278
int tcp_server_socket_setopt(int port, int opt, const void *optval, int optlen)
call socket(), setsockopt(), bind(), listen()
Definition: network4.c:298
int udp_bind(int sofd, int port)
call bind()
Definition: network4.c:163
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 udp_server_socket_setopt(int port, int opt, const void *optval, int optlen)
call socket(), setsockopt(), bind()
Definition: network4.c:78
unsigned char * to_address_num8(char *addr, int mode)
IPアドレス(文字列)→ [IPアドレス],[ネットマスク](数字8byte)
Definition: network4.c:1620
int tcp_bind_setopt(int sofd, int port, int opt, const void *optval, int optlen)
call setsockopt(), bind()
Definition: network4.c:580
int tcp_client_bind_socket(char *hostname, int sport, int cport)
call socket(), bind(), connect()
Definition: network4.c:491
int socket_close(int sofd)
call shutdown(), close()
Definition: network4.c:689
int tcp_connect(int sofd, char *hostname, int port)
call connect()
Definition: network4.c:656
int tcp_send_mesgln(int sock, char *mesg)
Definition: network4.c:892
char * get_hostname(char *ipaddr)
IPv4アドレス(文字列)→ ホスト名(文字列)
Definition: network4.c:1026
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_bind_setopt(int sofd, int port, int opt, const void *optval, int optlen)
call setsockopt(), bind()
Definition: network4.c:200
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
unsigned char * get_mynetaddr_num()
自分の IPv4ネットワークアドレス(数字)
Definition: network4.c:1415
unsigned char * to_address_num4(char *addr, int mode)
IPアドレス(文字列)→ [IPアドレス](数字4byte)
Definition: network4.c:1756
int tcp_client_socket(char *hostname, int port)
call socket(), connect()
Definition: network4.c:444
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
char * get_localip_bydest(char *dest)
自分の IPv4アドレス(文字列)
Definition: network4.c:1221
unsigned char * get_myipaddr_num()
自分の [IPアドレス],[ネットマスク](数字)
Definition: network4.c:1092
int tcp_server_bind(int port)
call socket(), bind()
Definition: network4.c:353
char * get_mynetaddr()
自分の IPv4ネットワークアドレス(文字列)
Definition: network4.c:1386
struct sockaddr_in get_sockaddr_bynum(char *ipnum, unsigned short cport)
Definition: network4.c:1464
unsigned char * get_ipaddr_num(struct in_addr sin_addr)
構造体  → IPv4アドレス(数字4byte)
Definition: network4.c:1310
char * get_myipaddr()
自分の [IPアドレス]/[ネットマスク](文字列)
Definition: network4.c:1188
int recv_wait(int sock, int tm)
Definition: network4.c:1842
int udp_client_socket(char *hostname, int port, struct sockaddr_in *sv_addr)
call socket()
Definition: network4.c:129
int get_valid_udp_socket(int min, int max, unsigned short *port)
Definition: network4.c:1954
char * get_ipaddr_byname(char *hostname)
ホスト名 → IPv4アドレス(文字列) 
Definition: network4.c:1333
int tcp_server_bind_setopt(int port, int opt, const void *optval, int optlen)
call socket(), setsockopt(), bind()
Definition: network4.c:394
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
int recv_wait_twin(int sock1, int sock2, int tm)
Definition: network4.c:1865
char * to_address_char4(unsigned char *n)
[IPアドレス](数字4byte)→ IPアドレス(文字列)
Definition: network4.c:1816
int tcp_server_socket(int port)
call socket(), bind(), listen()
Definition: network4.c:249
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
int udp_server_socket(int port)
call socket(), bind()
Definition: network4.c:28
void cleanup_network(void)
Definition: network4.c:2044
unsigned char * get_ipaddr_byname_num(char *hostname)
ホスト名 → IPv4アドレス(数字4byte)
Definition: network4.c:1361
char * get_hostname_bynum(unsigned char *num)
IPv4アドレス(数字) → ホスト名(文字列)
Definition: network4.c:990
char * to_address_char8(unsigned char *n)
[IPアドレス],[ネットマスク](数字8byte)→ IPアドレス(文字列)
Definition: network4.c:1727
#define MAXIFNO
取り扱うネットワークインターフェイスの最大数
Definition: network4.h:64
#define RECV_TIMEOUTED
Definition: network4.h:59
ネットワーク用ライブラリヘッダ for IPv4/IPv6
#define get_localip()
Definition: network.h:230
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition: tools.c:3491
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:3532
#define mstream
バイト型 メッセージストリーム
Definition: tools.h:167
#define freeNull(p)
Definition: tools.h:201
#define make_mstream(s)
make_ringBuffer()
Definition: tools.h:385