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