00001
00013 #include "network.h"
00014 #include <time.h>
00015
00016
00017
00031 int udp_server_socket(int port)
00032 {
00033 int sofd, err;
00034 struct sockaddr_in sv_addr;
00035
00036 sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00037 if (sofd<0) return -1;
00038
00039 memset(&sv_addr, 0, sizeof(sv_addr));
00040 sv_addr.sin_family = AF_INET;
00041 sv_addr.sin_port = htons(port);
00042 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00055 if (err<0) {
00056 socket_close(sofd);
00057 return -3;
00058 }
00059
00060 return sofd;
00061 }
00062
00063
00081 int udp_server_socket_setopt(int port, int opt, const void* optval, int optlen)
00082 {
00083 int sofd, err;
00084 struct sockaddr_in sv_addr;
00085
00086 sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00087 if (sofd<0) return -1;
00088
00089 memset(&sv_addr, 0, sizeof(sv_addr));
00090 sv_addr.sin_family = AF_INET;
00091 sv_addr.sin_port = htons(port);
00092 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00093
00094 if (opt>0) {
00095 #ifdef WIN32
00096 err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00097 #else
00098 err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00099 #endif
00100 if (err<0) {
00101 socket_close(sofd);
00102 return -2;
00103 }
00104 }
00105
00106 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00107 if (err<0) {
00108 socket_close(sofd);
00109 return -3;
00110 }
00111
00112 return sofd;
00113 }
00114
00115
00132 int udp_client_socket(char* hostname, int port, struct sockaddr_in* sv_addr)
00133 {
00134 int sofd;
00135 struct hostent* shost;
00136
00137 sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
00138 if (sofd<0) return -1;
00139
00140 shost = gethostbyname(hostname);
00141 if (shost==NULL) {
00142 socket_close(sofd);
00143 return -4
00144 }
00145
00146 memset(sv_addr, 0, sizeof(*sv_addr));
00147 sv_addr->sin_family = AF_INET;
00148 sv_addr->sin_port = htons(port);
00149 memcpy(&(sv_addr->sin_addr), shost->h_addr, shost->h_length);
00150
00151 return sofd;
00152 }
00153
00154
00166 int udp_bind(int sofd, int port)
00167 {
00168 int err;
00169 struct sockaddr_in sv_addr;
00170
00171 if (sofd<=0) return sofd;
00172
00173 memset(&sv_addr, 0, sizeof(sv_addr));
00174 sv_addr.sin_family = AF_INET;
00175 sv_addr.sin_port = htons(port);
00176 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00177
00178 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00179 if (err<0) {
00180 socket_close(sofd);
00181 return -3;
00182 }
00183
00184 return sofd;
00185 }
00186
00187
00203 int udp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)
00204 {
00205 int err;
00206 struct sockaddr_in sv_addr;
00207
00208 if (sofd<=0) return sofd;
00209
00210 memset(&sv_addr, 0, sizeof(sv_addr));
00211 sv_addr.sin_family = AF_INET;
00212 sv_addr.sin_port = htons(port);
00213 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00214
00215 if (opt>0) {
00216 #ifdef WIN32
00217 err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00218 #else
00219 err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00220 #endif
00221 if (err<0) {
00222 socket_close(sofd);
00223 return -2;
00224 }
00225 }
00226
00227 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00228 if (err<0) {
00229 socket_close(sofd);
00230 return -3;
00231 }
00232
00233 return sofd;
00234 }
00235
00236
00252 int tcp_server_socket(int port)
00253 {
00254 int sofd, err;
00255 struct sockaddr_in sv_addr;
00256
00257 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00258 if (sofd<0) return -1;
00259
00260 memset(&sv_addr, 0, sizeof(sv_addr));
00261 sv_addr.sin_family = AF_INET;
00262 sv_addr.sin_port = htons(port);
00263 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00264
00265 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00266 if (err<0) {
00267 socket_close(sofd);
00268 return -3;
00269 }
00270
00271 err = listen(sofd, 10);
00272 if (err==-1) {
00273 socket_close(sofd);
00274 return -6;
00275 }
00276
00277 return sofd;
00278 }
00279
00280
00281
00302 int tcp_server_socket_setopt(int port, int opt, const void* optval, int optlen)
00303 {
00304 int sofd, err;
00305 struct sockaddr_in sv_addr;
00306
00307 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00308 if (sofd<0) return -1;
00309
00310 memset(&sv_addr, 0, sizeof(sv_addr));
00311 sv_addr.sin_family = AF_INET;
00312 sv_addr.sin_port = htons(port);
00313 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00314
00315 if (opt>0) {
00316 #ifdef WIN32
00317 err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00318 #else
00319 err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00320 #endif
00321 if (err<0) {
00322 socket_close(sofd);
00323 return -2;
00324 }
00325 }
00326
00327 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00328 if (err<0) {
00329 socket_close(sofd);
00330 return -3;
00331 }
00332
00333 err = listen(sofd, 10);
00334 if (err==-1) {
00335 socket_close(sofd);
00336 return -6;
00337 }
00338
00339 return sofd;
00340 }
00341
00342
00357 int tcp_server_bind(int port)
00358 {
00359 int sofd, err;
00360 struct sockaddr_in sv_addr;
00361
00362 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00363 if (sofd<0) return -1;
00364
00365 memset(&sv_addr, 0, sizeof(sv_addr));
00366 sv_addr.sin_family = AF_INET;
00367 sv_addr.sin_port = htons(port);
00368 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00369
00370 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00371 if (err<0) {
00372 socket_close(sofd);
00373 return -3;
00374 }
00375
00376 return sofd;
00377 }
00378
00379
00398 int tcp_server_bind_setopt(int port, int opt, const void* optval, int optlen)
00399 {
00400 int sofd, err;
00401 struct sockaddr_in sv_addr;
00402
00403 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00404 if (sofd<0) return -1;
00405
00406 if (opt>0) {
00407 #ifdef WIN32
00408 err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00409 #else
00410 err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00411 #endif
00412 if (err<0) {
00413 socket_close(sofd);
00414 return -2;
00415 }
00416 }
00417
00418 memset(&sv_addr, 0, sizeof(sv_addr));
00419 sv_addr.sin_family = AF_INET;
00420 sv_addr.sin_port = htons(port);
00421 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00422
00423 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00424 if (err<0) {
00425 socket_close(sofd);
00426 return -3;
00427 }
00428
00429 return sofd;
00430 }
00431
00432
00448 int tcp_client_socket(char* hostname, int port)
00449 {
00450 int sofd, err;
00451 struct hostent *shost;
00452 struct sockaddr_in sv_addr;
00453
00454 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00455 if (sofd<0) return -1;
00456
00457 shost = gethostbyname(hostname);
00458 if (shost==NULL) {
00459 socket_close(sofd);
00460 return -4;
00461 }
00462
00463 memset(&sv_addr, 0, sizeof(sv_addr));
00464 sv_addr.sin_family = AF_INET;
00465 sv_addr.sin_port = htons(port);
00466 memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00467
00468 err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00469 if (err<0) {
00470 socket_close(sofd);
00471 return -5;
00472 }
00473
00474 return sofd;
00475 }
00476
00477
00495 int tcp_client_bind_socket(char* hostname, int sport, int cport)
00496 {
00497 int sofd, err;
00498 struct hostent *shost;
00499 struct sockaddr_in sv_addr;
00500
00501 sofd = (int)socket(AF_INET, SOCK_STREAM, 0);
00502 if (sofd<0) return -1;
00503
00504 memset(&sv_addr, 0, sizeof(sv_addr));
00505 sv_addr.sin_family = AF_INET;
00506 sv_addr.sin_port = htons(cport);
00507 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00508
00509 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00510 if (err<0) {
00511 socket_close(sofd);
00512 return -3;
00513 }
00514
00515 shost = gethostbyname(hostname);
00516 if (shost==NULL) {
00517 socket_close(sofd);
00518 return -4;
00519 }
00520
00521 memset(&sv_addr, 0, sizeof(sv_addr));
00522 sv_addr.sin_family = AF_INET;
00523 sv_addr.sin_port = htons(sport);
00524 memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00525
00526 err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00527 if (err<0) {
00528 socket_close(sofd);
00529 return -5;
00530 }
00531
00532 return sofd;
00533 }
00534
00535
00547 int tcp_bind(int sofd, int port)
00548 {
00549 int err;
00550 struct sockaddr_in sv_addr;
00551
00552 if (sofd<=0) return sofd;
00553
00554 memset(&sv_addr, 0, sizeof(sv_addr));
00555 sv_addr.sin_family = AF_INET;
00556 sv_addr.sin_port = htons(port);
00557 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00558
00559 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00560 if (err<0) {
00561 socket_close(sofd);
00562 return -3;
00563 }
00564
00565 return sofd;
00566 }
00567
00568
00584 int tcp_bind_setopt(int sofd, int port, int opt, const void* optval, int optlen)
00585 {
00586 int err;
00587 struct sockaddr_in sv_addr;
00588
00589 if (sofd<=0) return sofd;
00590
00591 if (opt>0) {
00592 #ifdef WIN32
00593 err = setsockopt(sofd, SOL_SOCKET, opt, (const char*)optval, optlen);
00594 #else
00595 err = setsockopt(sofd, SOL_SOCKET, opt, optval, optlen);
00596 #endif
00597 if (err<0) {
00598 socket_close(sofd);
00599 return -2;
00600 }
00601 }
00602
00603 memset(&sv_addr, 0, sizeof(sv_addr));
00604 sv_addr.sin_family = AF_INET;
00605 sv_addr.sin_port = htons(port);
00606 sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00607
00608 err = bind(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00609 if (err<0) {
00610 socket_close(sofd);
00611 return -3;
00612 }
00613
00614 return sofd;
00615 }
00616
00617
00631 int accept_intr(int sock, struct sockaddr* cl_addr, socklen_t* cdlen)
00632 {
00633 int nsofd = 0;
00634
00635 do {
00636 nsofd = (int)accept(sock, cl_addr, cdlen);
00637 } while (nsofd==-1 && errno==EINTR);
00638
00639
00640
00641 return nsofd;
00642 }
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660 int tcp_connect(int sofd, char* hostname, int port)
00661 {
00662 int err;
00663 struct hostent *shost;
00664 struct sockaddr_in sv_addr;
00665
00666 shost = gethostbyname(hostname);
00667 if (shost==NULL) return -4;
00668
00669 memset(&sv_addr, 0, sizeof(sv_addr));
00670 sv_addr.sin_family = AF_INET;
00671 sv_addr.sin_port = htons(port);
00672 memcpy(&sv_addr.sin_addr, shost->h_addr, shost->h_length);
00673
00674 err = connect(sofd, (struct sockaddr*)&sv_addr, sizeof(sv_addr));
00675 if (err<0) return -5;
00676 return 0;
00677 }
00678
00679
00693 int socket_close(int sofd)
00694 {
00695 int err = -1;
00696
00697 if (sofd>0) {
00698 #ifdef WIN32
00699 err = shutdown(sofd, 2);
00700 closesocket(sofd);
00701 #else
00702 err = shutdown(sofd, SHUT_RDWR);
00703 close(sofd);
00704 #endif
00705 }
00706 return err;
00707 }
00708
00709
00710
00712
00713
00714
00715
00730 int udp_recv(int sock, char* rmsg, int size, struct sockaddr_in* sv_addr)
00731 {
00732 int cc;
00733 socklen_t cadlen;
00734
00735 cadlen = sizeof(*sv_addr);
00736 memset(rmsg, 0, size);
00737 cc = recvfrom(sock, rmsg, size, 0, (struct sockaddr*)sv_addr, &cadlen);
00738
00739 return cc;
00740 }
00741
00742
00743
00760 int udp_send(int sock, char* smsg, int size, struct sockaddr_in* sv_addr)
00761 {
00762 int cc;
00763
00764 if (size<=0) size = (int)strlen(smsg);
00765
00766 cc = sendto(sock, smsg, size, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00767
00768 return cc;
00769 }
00770
00771
00772
00786 int tcp_recv(int sock, char* rmsg, int size)
00787 {
00788 int cc;
00789
00790 memset(rmsg, 0, size);
00791 cc = recv(sock, rmsg, size, 0);
00792
00793 return cc;
00794 }
00795
00796
00797
00812 int tcp_send(int sock, char* smsg, int size)
00813 {
00814 int cc;
00815
00816 if (size<=0) size = (int)strlen(smsg);
00817 cc = send(sock, smsg, size, 0);
00818
00819 return cc;
00820 }
00821
00822
00823
00843 int udp_recv_wait(int sock, char* rmsg, int size, struct sockaddr_in* sv_addr, int tm)
00844 {
00845 int cc;
00846
00847 if (recv_wait(sock, tm)) {
00848 cc = udp_recv(sock, rmsg, size, sv_addr);
00849 }
00850 else {
00851 return RECV_TIMEOUTED;
00852 }
00853 return cc;
00854 }
00855
00856
00857
00876 int tcp_recv_wait(int sock, char* mesg, int sz, int tm)
00877 {
00878 int cc;
00879
00880 if (recv_wait(sock, tm)) {
00881 cc = recv(sock, mesg, sz, 0);
00882 }
00883 else {
00884 return RECV_TIMEOUTED;
00885 }
00886 return cc;
00887 }
00888
00889
00890
00902 int tcp_send_mesgln(int sock, char* mesg)
00903 {
00904 int cc, sz;
00905 char* buf;
00906
00907 sz = (int)strlen(mesg) + 3;
00908 buf = (char*)malloc(sz);
00909 if (buf==NULL) return -1;
00910
00911 strncpy(buf, mesg, sz);
00912 strncat(buf, "\r\n", 2);
00913
00914 cc = send(sock, buf, (int)strlen(buf), 0);
00915
00916 free(buf);
00917 return cc;
00918 }
00919
00920
00921
00922
00954 int tcp_recv_mstream(int sock, char* mesg, int sz, mstream* sb, int tm)
00955 {
00956 int cc;
00957 unsigned char* pp;
00958
00959 if (mesg==NULL || sb==NULL) return -2;
00960 memset(mesg, 0, sz);
00961
00962 if (sb->buf==NULL) {
00963 *sb = make_mstream(RECVBUFSZ);
00964 if (sb->buf==NULL) return -3;
00965 }
00966
00967 while (sb->datano==0) {
00968 cc = tcp_recv_wait(sock, mesg, sz, tm);
00969 if (cc<=0) return cc;
00970 put_mstream(sb, (unsigned char*)mesg);
00971 memset(mesg, 0, sz);
00972 }
00973
00974 pp = get_mstream(sb);
00975 if (pp==NULL) return -4;
00976 if (strlen((const char*)pp)>=(unsigned int)sz) {
00977 memcpy(mesg, pp, sz-1);
00978 free(pp);
00979 return -5;
00980 }
00981 memcpy(mesg, pp, strlen((const char*)pp));
00982
00983 free(pp);
00984 return (int)strlen(mesg);
00985 }
00986
00987
00988
00989
00991
00992
00993
00994
01003 char* get_hostname_bynum(unsigned char* num)
01004 {
01005 int len;
01006 char* hname;
01007 struct hostent* hent;
01008
01009 #ifdef WIN32
01010 hent = gethostbyaddr((const char*)num, 4, AF_INET);
01011 #else
01012 hent = gethostbyaddr(num, 4, AF_INET);
01013 #endif
01014
01015 if (hent==NULL) return NULL;
01016
01017 len = (int)strlen(hent->h_name);
01018 hname = (char*)malloc(len+1);
01019 if (hname==NULL) {
01020 free(hent);
01021 return NULL;
01022 }
01023 memcpy(hname, hent->h_name, len+1);
01024
01025 return hname;
01026 }
01027
01028
01029
01040 char* get_hostname(char* ipaddr)
01041 {
01042 char* name;
01043 unsigned char* num;
01044
01045 num = to_address_num4(ipaddr, 1);
01046 if (num==NULL) return NULL;
01047
01048 name = get_hostname_bynum(num);
01049 free(num);
01050
01051 return name;
01052 }
01053
01054
01055
01056 #ifdef WIN32
01057
01068 unsigned char* get_myipaddr_num()
01069 {
01070 unsigned char* ipnum = NULL;
01071 char* ipaddr = get_localip();
01072
01073 if (ipaddr!=NULL) {
01074 ipnum = to_address_num8(ipaddr, 0);
01075 free(ipaddr);
01076 }
01077
01078 return ipnum;
01079 }
01080
01081
01082
01083 #else
01084
01107 unsigned char* get_myipaddr_num()
01108 {
01109 int i, sofd, len;
01110
01111 unsigned char* addr = NULL;
01112 struct ifconf ifc;
01113 struct ifreq* ifq;
01114 struct ifreq* ifp;
01115
01116
01117 len = sizeof(struct ifreq)*MAXIFNO;
01118 ifp = ifq = (struct ifreq*)malloc(len);
01119 if (ifq==NULL) return NULL;
01120 ifc.ifc_len = len;
01121 ifc.ifc_req = ifq;
01122
01123 sofd = socket(AF_INET, SOCK_DGRAM, 0);
01124 if (sofd<0) {
01125 perror("get_myipaddr_num: socket");
01126 return NULL;
01127 }
01128
01129
01130
01131 if (ioctl(sofd, SIOCGIFCONF, &ifc)<0) {
01132 socket_close(sofd);
01133 free(ifq);
01134 return NULL;
01135 }
01136
01137
01138 ifp = ifq;
01139 for (i=0; i<MAXIFNO; i++) {
01140
01141
01142 if (ioctl(sofd, SIOCGIFFLAGS, ifp)<0) {
01143 socket_close(sofd);
01144 free(ifq);
01145 return NULL;
01146 }
01147
01148 if ((ifp->ifr_flags&IFF_UP) && !(ifp->ifr_flags&IFF_LOOPBACK)) {
01149 int j;
01150 unsigned char* p = (unsigned char*)ifp->ifr_addr.sa_data;
01151
01152 addr = (unsigned char*)malloc(8);
01153 if (addr==NULL) {
01154 socket_close(sofd);
01155 free(ifq);
01156 return NULL;
01157 }
01158
01159
01160 if (ioctl(sofd, SIOCGIFADDR, ifp)<0) {
01161 socket_close(sofd);
01162 free(ifq);
01163 free(addr);
01164 return NULL;
01165 }
01166 for (j=0; j<4; j++) addr[j] = p[j+2];
01167
01168
01169 if (ioctl(sofd, SIOCGIFNETMASK, ifp)<0) {
01170 socket_close(sofd);
01171 free(ifq);
01172 free(addr);
01173 return NULL;
01174 }
01175 for (j=0; j<4; j++) addr[j+4] = p[j+2];
01176
01177 return addr;
01178 }
01179 ifp++;
01180 }
01181
01182 socket_close(sofd);
01183 free(ifq);
01184 return NULL;
01185 }
01186
01187
01188
01202 char* get_myipaddr()
01203 {
01204 char* addr;
01205 unsigned char* n;
01206
01207 n = get_myipaddr_num();
01208 if (n==NULL) return NULL;
01209
01210 addr = (char*)malloc(32);
01211 if (addr==NULL) {
01212 free(n);
01213 return NULL;
01214 }
01215 memset(addr, 0, 32);
01216
01217 snprintf(addr, 31, "%d.%d.%d.%d/%d.%d.%d.%d", n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
01218
01219 free(n);
01220 return addr;
01221 }
01222
01223 #endif
01224
01225
01226
01236 char* get_localip_bydest(char* dest)
01237 {
01238 int err, sofd;
01239 socklen_t len;
01240 char* addr;
01241 char* ip;
01242 struct sockaddr_in localif;
01243 struct sockaddr_in remote;
01244
01245 if (dest==NULL) return NULL;
01246 ip = get_ipaddr_byname(dest);
01247 if (ip ==NULL) return NULL;
01248
01249 memset(&localif, 0, sizeof(struct sockaddr_in));
01250 memset(&remote, 0, sizeof(struct sockaddr_in));
01251 remote.sin_family = AF_INET;
01252 remote.sin_addr.s_addr = inet_addr(ip);
01253 remote.sin_port = htons(9999);
01254 free(ip);
01255
01256 sofd = (int)socket(AF_INET, SOCK_DGRAM, 0);
01257 if (sofd<0) return NULL;
01258
01259 err = connect(sofd, (struct sockaddr*)&remote, sizeof(remote));
01260 if (err<0) {
01261 socket_close(sofd);
01262 return NULL;
01263 }
01264
01265 len = sizeof(localif);
01266 err = getsockname(sofd, (struct sockaddr *)&localif, &len);
01267 if (err<0) {
01268 socket_close(sofd);
01269 return NULL;
01270 }
01271 socket_close(sofd);
01272
01273 addr = get_ipaddr(localif.sin_addr);
01274 return addr;
01275 }
01276
01277
01278
01293 char* get_ipaddr(struct in_addr sin_addr)
01294 {
01295 char* ip;
01296 unsigned char* pp;
01297
01298 pp = (unsigned char*)&(sin_addr);
01299 if (pp[0]==0) return NULL;
01300
01301 ip = (char*)malloc(16);
01302 if (ip==NULL) return NULL;
01303 memset(ip, 0, 16);
01304
01305 snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01306
01307 return ip;
01308 }
01309
01310
01311
01326 unsigned char* get_ipaddr_num(struct in_addr sin_addr)
01327 {
01328 unsigned char* ip;
01329 unsigned char* pp;
01330
01331 ip = (unsigned char*)malloc(4);
01332 if (ip==NULL) return NULL;
01333
01334 pp = (unsigned char*)&(sin_addr);
01335 memcpy(ip, pp, 4);
01336
01337 return ip;
01338 }
01339
01340
01341
01350 char* get_ipaddr_byname(char* hostname)
01351 {
01352 struct hostent *host;
01353 char* ip;
01354 unsigned char* pp;
01355
01356 host = gethostbyname(hostname);
01357 if (host==NULL) return NULL;
01358
01359 ip = (char*)malloc(16);
01360 if (ip==NULL) return NULL;
01361 memset(ip, 0, 16);
01362
01363 pp = (unsigned char*)(host->h_addr);
01364 snprintf(ip, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01365
01366 return ip;
01367 }
01368
01369
01370
01379 unsigned char* get_ipaddr_byname_num(char* hostname)
01380 {
01381 struct hostent *host;
01382 unsigned char* ip;
01383 unsigned char* pp;
01384
01385 host = gethostbyname(hostname);
01386 if (host==NULL) return NULL;
01387 ip = (unsigned char*)malloc(4);
01388 if (ip==NULL) return NULL;
01389
01390 pp = (unsigned char*)(host->h_addr);
01391 memcpy(ip, pp, 4);
01392
01393 return ip;
01394 }
01395
01396
01397
01405 char* get_mynetaddr()
01406 {
01407 char* net;
01408 unsigned char* pp;
01409
01410 pp = get_mynetaddr_num();
01411 if (pp==NULL) return NULL;
01412
01413 net = (char*)malloc(16);
01414 if (net==NULL) {
01415 free(pp);
01416 return NULL;
01417 }
01418 memset(net, 0, 16);
01419
01420 snprintf(net, 15, "%d.%d.%d.%d", pp[0], pp[1], pp[2], pp[3]);
01421
01422 free(pp);
01423 return net;
01424 }
01425
01426
01427
01435 unsigned char* get_mynetaddr_num()
01436 {
01437 int i;
01438 unsigned char* net;
01439 unsigned char* ip;
01440 unsigned char* mk;
01441
01442 ip = get_myipaddr_num();
01443 if (ip==NULL) return NULL;
01444 mk = &(ip[4]);
01445
01446 net = (unsigned char*)malloc(4);
01447 if (net==NULL) {
01448 free(ip);
01449 return NULL;
01450 }
01451
01452 for (i=0; i<4; i++) net[i] = ip[i] & mk[i];
01453
01454 free(ip);
01455 return net;
01456 }
01457
01458
01459
01464 struct sockaddr_in get_sockaddr(char* hostname, unsigned short cport)
01465 {
01466 struct sockaddr_in ss_addr;
01467 struct hostent *shost;
01468
01469
01470 shost = gethostbyname(hostname);
01471 if (shost==NULL) {
01472 ss_addr.sin_family = 0;
01473 ss_addr.sin_port = 0;
01474 return ss_addr;
01475 }
01476
01477 memset(&ss_addr, 0, sizeof(ss_addr));
01478 ss_addr.sin_family = AF_INET;
01479 ss_addr.sin_port = htons(cport);
01480 memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
01481
01482 return ss_addr;
01483 }
01484
01485
01486
01487 struct sockaddr_in get_sockaddr_bynum(char* ipnum, unsigned short cport)
01488 {
01489 struct sockaddr_in ss_addr;
01490
01491 memset(&ss_addr, 0, sizeof(ss_addr));
01492 ss_addr.sin_family = AF_INET;
01493 ss_addr.sin_port = htons(cport);
01494 memcpy(&(ss_addr.sin_addr), ipnum, 4);
01495
01496 return ss_addr;
01497 }
01498
01499
01500
01501 struct sockaddr_in get_local_sockaddr(unsigned short cport)
01502 {
01503 struct sockaddr_in ss_addr;
01504 struct hostent *shost;
01505
01506
01507
01508 shost = gethostbyname("127.0.0.1");
01509
01510 memset(&ss_addr, 0, sizeof(ss_addr));
01511 ss_addr.sin_family = AF_INET;
01512 ss_addr.sin_port = htons(cport);
01513 memcpy(&(ss_addr.sin_addr), shost->h_addr, shost->h_length);
01514
01515 return ss_addr;
01516 }
01517
01518
01519
01531 int is_same_sockaddr(struct sockaddr_in addr1, struct sockaddr_in addr2)
01532 {
01533 int i, len;
01534 unsigned char *p1, *p2;
01535
01536 p1 = (unsigned char*)&(addr1.sin_addr);
01537 p2 = (unsigned char*)&(addr2.sin_addr);
01538 len = sizeof(addr1.sin_addr);
01539
01540 for (i=0; i<len; i++) {
01541 if (p1[i]!=p2[i]) return FALSE;
01542 }
01543
01544 p1 = (unsigned char*)&(addr1.sin_port);
01545 p2 = (unsigned char*)&(addr2.sin_port);
01546 len = sizeof(addr1.sin_port);
01547
01548 for (i=0; i<len; i++) {
01549 if (p1[i]!=p2[i]) return FALSE;
01550 }
01551
01552 return TRUE;
01553 }
01554
01555
01556
01569 int is_same_network_num(unsigned char* addr1, unsigned char* addr2, unsigned char* mask)
01570 {
01571 int i;
01572
01573 if (addr1==NULL || addr2==NULL) return FALSE;
01574
01575 if (mask==NULL) {
01576 for (i=0; i<4; i++) {
01577 if (addr1[i] != addr2[i]) return FALSE;
01578 }
01579 }
01580 else {
01581 for (i=0; i<4; i++) {
01582 if ((addr1[i]&mask[i]) != (addr2[i]&mask[i])) return FALSE;
01583 }
01584 }
01585 return TRUE;
01586 }
01587
01588
01589
01603 int is_same_network(char* addr1, char* addr2, char* mask)
01604 {
01605 int ret;
01606 unsigned char* a1;
01607 unsigned char* a2;
01608 unsigned char* mk;
01609
01610 if (addr1==NULL || addr2==NULL || mask==NULL) return FALSE;
01611
01612 a1 = to_address_num4(addr1, 1);
01613 a2 = to_address_num4(addr2, 1);
01614 mk = to_address_num4(mask, 0);
01615 if (a1==NULL || a2==NULL || mk==NULL) {
01616 freeNull(a1);
01617 freeNull(a2);
01618 freeNull(mk);
01619 return FALSE;
01620 }
01621
01622 ret = is_same_network_num(a1, a2, mk);
01623 freeNull(a1);
01624 freeNull(a2);
01625 freeNull(mk);
01626
01627 return ret;
01628 }
01629
01630
01631
01648 unsigned char* to_address_num8(char* addr, int mode)
01649 {
01650 unsigned char* num;
01651 char* ps;
01652 char* pc;
01653 char* uc = NULL;
01654 int i;
01655
01656 if (addr==NULL) return NULL;
01657
01658 num = (unsigned char*)malloc(8);
01659 if (num==NULL) return NULL;
01660 memset(num, 0, 8);
01661
01662
01663
01664 ps = awk(addr, '/', 1);
01665 if (ps==NULL) {
01666 free(num);
01667 return NULL;
01668 }
01669
01670 i = (int)strlen(ps) - 1;
01671 while (i>0 && ps[i]=='.') i--;
01672 if (i>0) {
01673 if (isalpha(ps[i])) {
01674 if (mode==0) {
01675 free(num);
01676 free(ps);
01677 return NULL;
01678 }
01679 uc = (char*)get_ipaddr_byname_num(ps);
01680 if (uc==NULL) {
01681 free(num);
01682 free(ps);
01683 return NULL;
01684 }
01685 }
01686 }
01687
01688 if (uc==NULL) {
01689 for (i=0; i<4; i++) {
01690 pc = awk(ps, '.', i+1);
01691 if (pc==NULL) break;
01692 num[i] = (unsigned char)atoi(pc);
01693 free(pc);
01694 }
01695 }
01696 else {
01697 for (i=0; i<4; i++) num[i] = uc[i];
01698 free(uc);
01699 }
01700 free(ps);
01701
01702 ps = awk(addr, '/', 2);
01703
01704
01705 if (ps==NULL) {
01706 int f = OFF;
01707 for (i=3; i>=0; i--) {
01708 if (num[i]!=0 || f==ON) {
01709 num[i+4] = 0xff;
01710 f = ON;
01711 }
01712 else {
01713 num[i+4] = 0;
01714 }
01715 }
01716 return num;
01717 }
01718
01719
01720 for (i=0; i<4; i++) {
01721 pc = awk(ps, '.', i+1);
01722 if (pc==NULL) break;
01723 num[i+4] = (unsigned char)atoi(pc);
01724 free(pc);
01725 }
01726 free(ps);
01727
01728
01729 if (num[4]<=32 && num[5]==0 && num[6]==0 && num[7]==0) {
01730 int nn, cl = (int)num[4];
01731 for (i=0; i<4; i++) {
01732 nn = 8 - Max(0, Min(8, cl-8*i));
01733 num[i+4] = 0xff<<nn;
01734 }
01735 }
01736
01737 return num;
01738 }
01739
01740
01741
01756 char* to_address_char8(unsigned char* n)
01757 {
01758 char* addr;
01759 if (n==NULL) return NULL;
01760
01761 addr = (char*)malloc(32);
01762 if (addr==NULL) return NULL;
01763 memset(addr, 0, 32);
01764
01765 snprintf(addr, 31, "%d.%d.%d.%d/%d.%d.%d.%d", n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
01766
01767 return addr;
01768 }
01769
01770
01771
01786 unsigned char* to_address_num4(char* addr, int mode)
01787 {
01788 unsigned char* num;
01789 char* pc;
01790 char* uc = NULL;
01791 int i;
01792
01793 if (addr==NULL) return NULL;
01794
01795 num = (unsigned char*)malloc(4);
01796 if (num==NULL) return NULL;
01797 memset(num, 0, 4);
01798
01799
01800 i = (int)strlen(addr) - 1;
01801 while (i>0 && addr[i]=='.') i--;
01802 if (i>0) {
01803 if (isalpha(addr[i])) {
01804 if (mode==0) {
01805 free(num);
01806 return NULL;
01807 }
01808 uc = (char*)get_ipaddr_byname_num(addr);
01809 if (uc==NULL) {
01810 free(num);
01811 return NULL;
01812 }
01813 }
01814 }
01815
01816 if (uc==NULL) {
01817 for (i=0; i<4; i++) {
01818 pc = awk(addr, '.', i+1);
01819 if (pc==NULL) break;
01820 num[i] = (unsigned char)atoi(pc);
01821 free(pc);
01822 }
01823 }
01824 else {
01825 for (i=0; i<4; i++) num[i] = uc[i];
01826 free(uc);
01827 }
01828
01829 return num;
01830 }
01831
01832
01833
01847 char* to_address_char4(unsigned char* n)
01848 {
01849 char* addr;
01850 if (n==NULL) return NULL;
01851
01852 addr = (char*)malloc(16);
01853 if (addr==NULL) return NULL;
01854 memset(addr, 0, 16);
01855
01856 snprintf(addr, 15, "%d.%d.%d.%d", n[0], n[1], n[2], n[3]);
01857
01858 return addr;
01859 }
01860
01861
01862
01874 int recv_wait(int sock, int tm)
01875 {
01876 int nd;
01877 fd_set mask;
01878 struct timeval timeout;
01879 time_t otm, ntm;
01880
01881 otm = time(NULL);
01882 do {
01883 timeout.tv_sec = tm;
01884 timeout.tv_usec = 0;
01885 FD_ZERO(&mask);
01886 FD_SET(sock, &mask);
01887
01888
01889 nd = select(sock+1, &mask, NULL, NULL, &timeout);
01890 ntm = time(NULL);
01891 } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
01892
01893 return FD_ISSET(sock, &mask);
01894 }
01895
01896
01897
01898 int recv_wait_twin(int sock1, int sock2, int tm)
01899 {
01900 int ret = 0;
01901 int nm, nd;
01902 fd_set mask;
01903 struct timeval timeout;
01904 time_t otm, ntm;
01905
01906 nm = Max(sock1, sock2);
01907 otm = time(NULL);
01908 do {
01909 timeout.tv_sec = tm;
01910 timeout.tv_usec = 0;
01911 FD_ZERO(&mask);
01912 FD_SET(sock1, &mask);
01913 FD_SET(sock2, &mask);
01914 nd = select(nm+1, &mask, NULL, NULL, &timeout);
01915 ntm = time(NULL);
01916 } while ((nd<0 || (!FD_ISSET(sock1, &mask) && !FD_ISSET(sock2, &mask))) && (int)(ntm-otm)<=tm);
01917
01918 if (FD_ISSET(sock1, &mask)) ret += 1;
01919 if (FD_ISSET(sock2, &mask)) ret += 2;
01920
01921 return ret;
01922 }
01923
01924
01925
01937 int send_wait(int sock, int tm)
01938 {
01939 int nd;
01940 fd_set mask;
01941 struct timeval timeout;
01942 time_t otm, ntm;
01943
01944 otm = time(NULL);
01945 do {
01946 timeout.tv_sec = tm;
01947 timeout.tv_usec = 0;
01948 FD_ZERO(&mask);
01949 FD_SET(sock, &mask);
01950
01951
01952 nd = select(sock+1, NULL, &mask, NULL, &timeout);
01953 ntm = time(NULL);
01954 } while ((nd<0 || !FD_ISSET(sock, &mask)) && (int)(ntm-otm)<=tm);
01955
01956 return FD_ISSET(sock, &mask);
01957 }
01958
01959
01960
01970 void udp_hole_punching(int sock, struct sockaddr_in addr, int nm)
01971 {
01972 char data[LBUF];
01973
01974 if (nm<=0) nm = 4;
01975 else if (nm>LBUF) nm = LBUF;
01976
01977 memset(data, 0, nm);
01978 udp_send(sock, data, nm, &addr);
01979
01980 return;
01981 }
01982
01983
01984
01985
01986
01988
01989
01990
01991 int get_valid_udp_socket(int min, int max, unsigned short* port)
01992 {
01993 int i, sock, range;
01994
01995 range = max - min + 1;
01996 *port = rand()%range + min;
01997
01998 i = 1;
01999 sock = udp_server_socket((int)*port);
02000 while(sock<=0 && i<range) {
02001 (*port)++;
02002 if (*port>max) *port = ((int)*port)%max + min - 1;
02003 sock = udp_server_socket((int)*port);
02004 i++;
02005 }
02006
02007 if (sock<=0) *port = 0;
02008
02009 return sock;
02010 }
02011
02012
02013
02014 int get_valid_tcp_server_socket(int min, int max, unsigned short* port)
02015 {
02016 int i, sock, range;
02017
02018 range = max - min + 1;
02019 *port = rand()%range + min;
02020
02021 i = 1;
02022 sock = tcp_server_socket((int)*port);
02023 while(sock<=0 && i<range) {
02024 (*port)++;
02025 if (*port>max) *port = ((int)*port)%max + min - 1;
02026 sock = tcp_server_socket((int)*port);
02027 i++;
02028 }
02029
02030 if (sock<=0) *port = 0;
02031
02032 return sock;
02033 }
02034
02035
02036
02037 int get_valid_tcp_client_socket(int min, int max, char* hname, unsigned short sport, unsigned short* cport)
02038 {
02039 int i, sock, range;
02040
02041 range = max - min + 1;
02042 *cport = rand()%range + min;
02043
02044 i = 1;
02045 sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
02046 while(sock<0 && i<range) {
02047 (*cport)++;
02048 if (*cport>max) *cport = ((int)*cport)%max + min - 1;
02049 sock = tcp_client_bind_socket(hname, (int)sport, (int)*cport);
02050 i++;
02051 }
02052
02053 if (sock<=0) *cport = 0;
02054
02055 return sock;
02056 }
02057
02058
02059
02060
02062
02063
02064
02065
02066 #ifdef WIN32
02067 WSADATA WsaData;
02068 #endif
02069
02070
02071 int init_network(void)
02072 {
02073 int ret = 0;
02074
02075 #ifdef WIN32
02076 ret = WSAStartup(MAKEWORD(2,0), &WsaData);
02077 if (ret!=0) WSACleanup();
02078 #endif
02079
02080 return ret;
02081 }
02082
02083
02084 void cleanup_network(void)
02085 {
02086 #ifdef WIN32
02087 WSACleanup();
02088 #endif
02089 }
02090