免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7337 | 回复: 3
打印 上一主题 下一主题

[函数] 给大家两个ip地址转换函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-21 15:26 |只看该作者 |倒序浏览
由于库函数操作繁琐不适用并且线程不安全,特编制如下两个函数以得到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;
}

论坛徽章:
0
2 [报告]
发表于 2005-09-21 16:07 |只看该作者

给大家两个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;
}

论坛徽章:
0
3 [报告]
发表于 2005-09-21 16:19 |只看该作者

给大家两个ip地址转换函数

为什么总是有人喜欢自己造轮子呢?系统函数不好用吗?

论坛徽章:
0
4 [报告]
发表于 2005-09-21 16:28 |只看该作者

给大家两个ip地址转换函数

家花没有野花香
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP