快速业务通道

Jeremiah的小程序之一:Linux下获取本机的IP地址

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24
从这篇博客开始,Jeremiah将会把自己平常写的些简单的小程序或者平常读的开源代码中比较好的做法和应用整理下来. 本篇博客主要是抠取自live555MediaServer,在开启live555MediaServer的时候会读取本地IP,然后与rtsp://和文件名组成点播地址.live555MediaServer读取本地IP的主要方法是:发送一个TTL=0的组播包,接收这个包,然后解析发送地址,即为本机地址. 这种方法只能获得本机的最主要的IP地址(eth0).不能获取所有的IP地址. 抠取代码如下,操作平台为RedHat Linux ES5,gcc 4.1.2.
  1. /*******************************************************************************
  2. * Filename: get_ip.c
  3. * Created on: Feb 8, 2010
  4. * Author: Jeremiah
  5. * Description: 获取本机IP地址
  6. *
  7. ******************************************************************************/
  8. #include <stdio.h>
  9. #include <stdint.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <sys/socket.h> 拥有帝国一切,皆有可能。欢迎访问phome.net
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. #include <string.h>
  16. #include <sys/time.h>
  17. #include <sys/select.h>
  18. in_addr_t ourIPAddress();
  19. int setupDatagramSocket(uint16_t);
  20. uint8_t socketJoinGroup(int socket, uint32_t groupAddress);
  21. uint8_t writeSocket(int socket, struct in_addr address, uint32_t port,
  22. uint8_t ttlArg, unsigned char *buffer, unsigned bufferSize);
  23. int readSocket(int socket, unsigned char *buffer, unsigned bufferSize,
  24. struct sockaddr_in *fromAddress, struct timeval *timeout);
  25. int blockUntilReadable(int socket, struct timeval* timeout);
  26. uint8_t badAddress(uint32_t addr);
  27. uint8_t socketLeaveGroup(int socket, uint32_t groupAddress);
  28. uint8_t IsMulticastAddress(uint32_t address); 拥有帝国一切,皆有可能。欢迎访问phome.net
  29. #define SET_SOCKADDR_SIN_LEN(var)
  30. #define MAKE_SOCKADDR_IN(var,adr,prt) /*adr,prt must be in network order*/
  31. struct sockaddr_in var;
  32. var.sin_family = AF_INET;
  33. var.sin_addr.s_addr = (adr);
  34. var.sin_port = (prt);
  35. SET_SOCKADDR_SIN_LEN(var);
  36. int main(int argc, char **argv) {
  37. struct sockaddr_in ourAddress;
  38. ourAddress.sin_addr.s_addr = ourIPAddress();
  39. if (ourAddress.sin_addr.s_addr == 0) {
  40. printf("get local ip error!n");
  41. return 1;
  42. }
  43. printf("%sn", inet_ntoa(ourAddress.sin_addr));
  44. return 0;
  45. }
  46. in_addr_t ourIPAddress() {
  47. uint32_t ourAddress = 0;
  48. int sock = -1;
  49. 拥有帝国一切,皆有可能。欢迎访问phome.net struct in_addr testAddr;
  50. struct sockaddr_in fromAddr;
  51. fromAddr.sin_addr.s_addr = 0;
  52. // Get our address by sending a (0-TTL) multicast packet,
  53. // receiving it, and looking at the source address used.
  54. // (This is kinda bogus, but it provides the best guarantee
  55. // that other nodes will think our address is the same as we do.)
  56. testAddr.s_addr = inet_addr("228.67.43.92");
  57. uint16_t testPort = 15948;
  58. sock = setupDatagramSocket(testPort);
  59. if (sock < 0) {
  60. return 0;
  61. }
  62. if (!socketJoinGroup(sock, testAddr.s_addr)) {
  63. return 0;
  64. }
  65. unsigned char testString[] = "hostIdTest";
  66. unsigned testStrLength = sizeof(testString);
  67. if

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号