在socket编程中,如何获取连接另一端(客户端)的ip地址,使用accept或者getpeername

原文链接:https://blog.csdn.net/gukesdo/article/details/6889594

//这段代码没有实际的功能,只是为了获取连接另一端的ip地址 


 
 
  1. #include <iostream>
  2. #include <winsock.h>
  3. #include <stdio.h>
  4. #pragma comment(lib, “wsock32”)
  5. using namespace std;
  6. void main()
  7. {
  8. int ret = 0;
  9. WSADATA wsadata;
  10. WORD version = MAKEWORD( 2, 0);
  11. ret = WSAStartup(version,&wsadata);
  12. //服务器端口创建
  13. SOCKET m_hServerSocket;
  14. m_hServerSocket = socket(AF_INET,SOCK_STREAM, 0);
  15. //服务器端口绑定
  16. SOCKADDR_IN m_addr;
  17. m_addr.sin_family = AF_INET;
  18. m_addr.sin_addr.S_un.S_addr = INADDR_ANY; //如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址
  19. m_addr.sin_port = htons( 10000);
  20. ret = bind(m_hServerSocket,(LPSOCKADDR)&m_addr, sizeof(m_addr));
  21. //服务器端口开始监听
  22. ret = listen(m_hServerSocket, 10); //第二个参数指定最大申请的连接数
  23. WSADATA cli_wsadata;
  24. ret = WSAStartup(version,&cli_wsadata);
  25. //客户端端口创建
  26. SOCKET m_hClientSocket;
  27. m_hClientSocket = socket(AF_INET,SOCK_STREAM, 0);
  28. //客户端向服务器发送连接请求
  29. SOCKADDR_IN m_addr1;
  30. m_addr1.sin_family = AF_INET;
  31. m_addr1.sin_addr.S_un.S_addr = inet_addr( “192.168.100.57”); //服务器的ip地址
  32. m_addr1.sin_port = htons( 10000); //服务器socket的端口号
  33. ret = connect(m_hClientSocket,(LPSOCKADDR)&m_addr1, sizeof(m_addr1)); //从客户端端口m_hClientSocket想服务器端口m_addr1发送连接请求
  34. //0xCD,0xCD,0xCD,0XCD. 因为DEBUG为每个字节初始化0xcd(204),你未正确取得对方IP,并且你的变量未初始化的结果。
  35. SOCKET com_Sock;
  36. SOCKADDR_IN addr_conn;
  37. int nSize = sizeof(addr_conn);
  38. //initialize the memory block via the memset function
  39. memset(( void *)&addr_conn, 0, sizeof(addr_conn));
  40. com_Sock = accept(m_hServerSocket, NULL, NULL); //从连接队列中取第一个连接进行通信
  41. //开始时候错误是因为把第三个参数写成了(int *)(sizeof(addr_conn)),所以不会报错但是取不到正确结果!!!
  42. //com_Sock = accept(m_hServerSocket,(SOCKADDR *)&addr_conn,&nSize); //or
  43. getpeername(com_Sock,(SOCKADDR *)&addr_conn,&nSize);
  44. char szPeerAddress[ 16];
  45. //Sets buffers to a specified character.
  46. memset(( void *)szPeerAddress, 0, sizeof(szPeerAddress));
  47. cout << szPeerAddress << “**************” << endl;
  48. //If no error occurs, inet_ntoa returns a character pointer to a static buffer
  49. //containing the text address in standard ".’’ notation
  50. strcpy(szPeerAddress,inet_ntoa(addr_conn.sin_addr));
  51. //Copy a string.the second parameter strSource Null-terminated source string
  52. cout << szPeerAddress << endl;
  53. //so remember that every time use the inet_ntoa, you must copy the result by yourself
  54. //or it will be covered by the other value
  55. addr_conn.sin_addr.S_un.S_addr = inet_addr( “192.168.111.2”);
  56. cout << inet_ntoa(addr_conn.sin_addr) << endl;
  57. cout << endl;
  58. }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一款改自IPHook的IP数据包监控过滤程序 By ccc 2009-6-13 完成(ch2zh1@tom.com) IP包过滤程序采用IPHook驱动器程序,在内核层用钩子回调函数(IpHookFilter)勾住系统自带的IP过滤驱动器(System32\Drivers\IpFltDrv.sys),从而返回过滤驱动器传输的所有IP包数据。可以通过回调函数的返回值(PF_DROP、PF_FORWARD、PF_PASS),指示滤波驱动器对包的处理,是抛弃还是通过。 应用启动驱动器过程可以使用驱动器的安装,或使用系统的服务控制器(ServiceControl)直接启动和停止驱动程序。 服务控制器利用OpenSCManager等服务控制函数控制驱动程序的加载与卸载。这就使得应用程序可以在运行时自动加载和卸载需要的驱动程序。而不必设置驱动程序的安装过程。 初始的IPHook.sys只提供了IP包的监视过程即,仅仅返回IP头信息。在应用解释并显示这个头信息。经过写改的IPHook增加了对IP包的过滤处理,有几个设置命令: START_IP_HOOK :启动钩子过滤命令,建立连接IP滤波器的回调函数(原始命令) STOP_IP_HOOK :停止钩子过滤命令,撤销IP滤波器回调函数(原始命令) ADD_IP_HOOKADDR :添加过滤IP地址,回调函数判断IP包,以决定是放弃还是通过(新命令) DEL_IP_HOOKADDR :删除过滤IP地址(新命令) ADD_IP_HOOKPORT :添加过滤端口号(新命令) DEL_IP_HOOKPORT :删除过滤端口号(新命令) ADD_IP_OVER_HOOK :添加置换的IP地址,用于对指定目的的IP包置换源地址和端口号(New) DEL_IP_OVER_HOOK :取消IP地址置换。(New) 应用程序可一次设置和删除对个滤波地址和端口号。对于重复设置,IPHook可以正确识别并加以剔除。这是一个演示程序主要想说明windows2000驱动程序编程过程,及应用自动加载和卸载驱动的方式。 驱动程序的源码在DrvChecked.rar,要想正确编译,必须安装windows2000 DDK,并在VS2003下设置包含目录指向DDK的目录,库目录也要指向DDK的库目录: C:\NTDDK\inc C:\NTDDK\inc\ddk C:\NTDDK\libchk\i386 并且在排列上一定要排在头两个位置上。 这个驱动程序在VC++下是可以正确编译通过的。驱动程序名:DrvChecked.sys。使用时应该改为:iphook.sys。delphi下的应用程序为:IPPacketMonitor.exe,它使用IPHook.sys。 任何人可以自己编译和修改这个驱动程序,使之能够按照一定的方式运行,这里给出的只是本人的一个想法,希望能给各位带来一点帮助。任何应用程序都可以想打开文件一样使用这个驱动程序,关于使用方法请参考Release Notes.htm提供的线索。 有什么问题和建议请电邮:ch2zh1@tom.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值