百度空间 | 百度首页 
 
查看文章
 
两个函数以得到ip地址和端口号
2008-10-27 23:04
由于库函数操作繁琐不适用并且线程不安全,特编制如下两个函数以得到ip地址和端口号。本程序在cygwin下测试通过,不同平台下可能需要修改包含头文件。

/*************************************************************/

#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;

/* 根据struct sockaddr或者struct sockaddr_in得到字符串ip地址   */
char   *addr_to_string(void *addr, char *ip_str);

/* 根据struct sockaddr或者struct sockaddr_in得到主机子序端口号   */
unsigned short   get_port_number(void *addr);

/* 测试程序 */
int main(int argc, char **argv)
{
   char   *ip = "255.254.1.101";
   char   vsip[16];
   struct sockaddr_in addr;
   memset(&addr, 0, sizeof(addr));
   memset(vsip, 0, 16);
  
   addr.sin_addr.s_addr = inet_addr(ip);
   addr.sin_port = htons(9124);
  
   printf("ip:%s\n", addr_to_string(&addr, vsip));
   printf("port:%d\n", get_port_number(&addr));
  
   return 0;
  
}

/* 根据struct sockaddr或者struct sockaddr_in得到字符串ip地址   */
char   *addr_to_string(void *addr, char *ip_str)
{
   unsigned char *p = NULL;
   struct sockaddr_in *sin = NULL;
   if(ip_str == NULL)
   {
return NULL;
   }
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return NULL;
   }
  
   p = (char *)&sin->;sin_addr;
   sprintf(ip_str, "%d.%d.%d.%d", *p, *(p+1), *(p+2), *(p+3));
  
   return ip_str;
}

/* 根据struct sockaddr或者struct sockaddr_in得到主机子序端口号   */
unsigned short   get_port_number(void *addr)
{
   unsigned short port = 0;
   struct sockaddr_in *sin = NULL;
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return 0;
   }
  
   port = ntohs(sin->;sin_port);
  
   return port;
}
给大家两个ip地址转换函数

再接再励,总结一下,附完整代码:
/***********************************************/

#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;

/* 根据struct sockaddr或者struct sockaddr_in得到字符串ip地址   */
char   *addr_to_string(void *addr, char *ip_str);

/* 设置struct sockaddr或者struct sockaddr_in的ip地址 */
unsigned   long string_to_addr(void *addr, const char *ip);

/* 根据struct sockaddr或者struct sockaddr_in得到主机子序端口号   */
unsigned short   get_port_number(void *addr);

/* 设置struct sockaddr或者struct sockaddr_in的端口号   */
unsigned short   set_port_number(void *addr, unsigned short port);

/* 设置struct sockaddr或者struct sockaddr_in的ip地址和端口号 */
int set_addr(void *addr, const char *ip, unsigned short port);


/* 测试程序 */
int main(int argc, char **argv)
{
   char   *ip = "192.168.3.1";
   char   vsip[16];
   struct sockaddr_in addr;
   memset(&addr, 0, sizeof(addr));
   memset(vsip, 0, 16);
  
   if(set_addr(&addr, ip, 9124) < 0)
   {
printf("set_addr error!\n");
return -1;
   }
   
  
   printf("ip:%s\n", addr_to_string(&addr, vsip));
   printf("port:%d\n", get_port_number(&addr));
  
   return 0;
  
}

/* 根据struct sockaddr或者struct sockaddr_in得到字符串ip地址   */
char   *addr_to_string(void *addr, char *ip_str)
{
   unsigned char *p = NULL;
   struct sockaddr_in *sin = NULL;
   if(ip_str == NULL)
   {
return NULL;
   }
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return NULL;
   }
  
   p = (char *)&sin->;sin_addr;
   sprintf(ip_str, "%d.%d.%d.%d", *p, *(p+1), *(p+2), *(p+3));
  
   return ip_str;
}

/* 设置struct sockaddr或者struct sockaddr_in的ip地址 */
unsigned   long string_to_addr(void *addr, const char *ip)
{
   struct sockaddr_in *sin = NULL;
   sin = (struct sockaddr_in *)addr;
  
   if(sin == NULL)
   {
return 0;
   }
  
   if(ip == NULL)
   {
return 0;
   }
  
   sin->;sin_addr.s_addr = inet_addr(ip);
  
   return sin->;sin_addr.s_addr;
}


/* 根据struct sockaddr或者struct sockaddr_in得到主机子序端口号   */
unsigned short   get_port_number(void *addr)
{
   unsigned short port = 0;
   struct sockaddr_in *sin = NULL;
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return 0;
   }
  
   port = ntohs(sin->;sin_port);
  
   return port;
}
  
/* 设置struct sockaddr或者struct sockaddr_in的端口号   */
unsigned short   set_port_number(void *addr, unsigned short port)
{
   struct sockaddr_in *sin = NULL;
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return 0;
   }
  
   sin->;sin_port = htons(port);
  
   return sin->;sin_port;
}

/* 设置struct sockaddr或者struct sockaddr_in的ip地址和端口号 */
int set_addr(void *addr, const char *ip, unsigned short port)
{
   int ret = -1;
   struct sockaddr_in *sin = NULL;
  
   sin = (struct sockaddr_in *)addr;
   if(sin == NULL)
   {
return ret;
   }
  
   if(ip == NULL)
   {
return ret;
   }
  
   sin->;sin_addr.s_addr = inet_addr(ip);
   if(sin->;sin_addr.s_addr == INADDR_NONE)
   {
return ret;
   }
  
   sin->;sin_port = htons(port);
   if(sin->;sin_port >; 0)
   {
ret = 1;
   }
  
   return ret;
}

类别:Windows | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu