很早写的一个,通过希网获取公网ip的程序片段,今天重新写了一遍
   
#include
#include
#include < string.h>
#include
#include
#include
#include in.h>
#include
int port =80;
#define BUF_SIZE     200

  int is_valid_addr( const char *str)
{
     struct in_addr addr;
     int ret;

       ret = inet_pton(AF_INET, str, &addr);
     return ret;
}
int main()
{
         struct sockaddr_in pin;
         struct hostent *nlp_host;
         int sd=0;
         int len=0;
         int i,count=0;
         int recv_start=0,recv_end=0;
         char buf[BUF_SIZE]={0};
         char host[20]= "www.3322.org";
         char header[240]={0};
         char *pHost = 0;
         char buffer[200]={0};
         int ret;
    
         //setting socket param
         if((nlp_host = gethostbyname(host)) == 0)
        {
                printf( "error get host\n");
                exit(1);
         }
  
        bzero(&pin, sizeof(pin));
        pin.sin_family = AF_INET;
        pin.sin_addr.s_addr = htonl(INADDR_ANY);
        pin.sin_addr.s_addr = (( struct in_addr *)(nlp_host->h_addr))->s_addr;
        pin.sin_port = htons(port);
  
         if((sd = socket(AF_INET,SOCK_STREAM,0))== -1)
        {
                printf( "Error opening socket!!!\n");
                exit(1);
         }
  
         //together the info that will be sent to web server
        strcat(header, "GET");
        strcat(header, " ");
        strcat(header, "/dyndns/getip");
        strcat(header, " ");
        strcat(header, "HTTP/1.1\r\n");
        strcat(header, "HOST:");
        strcat(header,host);
        strcat(header, "\r\n");
        strcat(header, "ACCEPT:*/*");
        strcat(header, "\r\nConnection: close\r\n\r\n\r\n");
        
         //connect to the webserver,send the header,and receive the web sourcecode    
         if(connect(sd,( void *)&pin, sizeof(pin)) == -1)
            exit(1);
         if(send(sd,header,strlen(header),0) == -1)
           exit(1);

        len=recv(sd,buf,BUF_SIZE,0);
         if(len<0)
            exit(1);
         else
        {
             for(i=0;i             {
                   if(buf[i]=='\n')
                  {
                        count+=1;
                         if(count==7)
                        {
                             recv_start=i+1;
                         }
                          if(count==8)
                         {
                             recv_end=i-2;
                              break;
                          }
                   }
              }
              snprintf(buffer,recv_end-recv_start+2,buf+recv_start);
              ret = is_valid_addr(buffer);
               if(ret <= 0)
              {
                    printf( "is not valid ip\n");
                     return -1;
               }
}
              close(sd);
               return 0;
}