socket 编程中怎么获得别人的IP地址?
我想做一个服务端,监听外面传来的通信信号,监听到信号后,再判断这个外部传来信号的IP地址,是否是我指定的,如果不是我指定的,我就拒绝它访问,请问怎么做?满意答案我加分,双...
我想做一个服务端,监听外面传来的通信信号,监听到信号后,再判断这个外部传来信号的IP地址,是否是我指定的,如果不是我指定的,我就拒绝它访问,请问怎么做? 满意答案我加分,双倍,多点也可以。
展开
4个回答
展开全部
首先你需要解析外部传进来的数据包,正常情况下,通信数据包的包头已经包含了数据包的源端和目的端地址。目的端地址自然是你的IP地址,而你所要做的就是对源端地址进行判断。
如果源端地址是你指定的,那就解析数据包的净载荷部分(payload),进行相应的处理;
若不是你指定的,那么就不要处理,直接丢弃就好了。
这部分设计到socket底层编程,我以前用C#编写过,完全可以实现。
如果源端地址是你指定的,那就解析数据包的净载荷部分(payload),进行相应的处理;
若不是你指定的,那么就不要处理,直接丢弃就好了。
这部分设计到socket底层编程,我以前用C#编写过,完全可以实现。
更多追问追答
追问
那我在应用层写的socket编程,是不需要处理的吗?要是能在应用层处理,那又应该怎么处理呢?
追答
应用层的socket应该也可以获得整个数据包的吧。
你可以先使用抓包软件,比如Sniffer等抓个网络数据包看一看,看到什么字段是源端IP地址和通信端口。然后你比照一下应用层Socket所获得的数据包是什么样子的,是否包含这些重要字段,然后再按照需要进行操作。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
2015-08-04
展开全部
参考代码如下,相关的注解已经在代码中注释;
#include <iostream>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "wsock32")
using namespace std;
void main()
{
int ret = 0;
WSADATA wsadata;
WORD version = MAKEWORD(2,0);
ret = WSAStartup(version,&wsadata);
//服务器端口创建
SOCKET m_hServerSocket;
m_hServerSocket = socket(AF_INET,SOCK_STREAM,0);
//服务器端口绑定
SOCKADDR_IN m_addr;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址 。
#include <iostream>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "wsock32")
using namespace std;
void main()
{
int ret = 0;
WSADATA wsadata;
WORD version = MAKEWORD(2,0);
ret = WSAStartup(version,&wsadata);
//服务器端口创建
SOCKET m_hServerSocket;
m_hServerSocket = socket(AF_INET,SOCK_STREAM,0);
//服务器端口绑定
SOCKADDR_IN m_addr;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址 。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接打印client_addr.sin_addr.s_addr 的话只是一个网络序的无符号数字,你想看点分制的还得转换。用inet_ntoa()这个函数,pirntf("%s\r\n",inet_ntoa(client_addr.sin_addr)。再有如果你想处理IP层的头部的话,可以使用原始套接字RAW_SOCKET,这样IP报文的目的IP,源IP等都由你添了,不过校验和也得自己添。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你获取的accept( client , (sockaddr*)&client_addr, ....); client_addr 里面就有客服端的IP地址, 具体的内容请参看MSDN
追问
是client_addr.sin_addr.s_addr 吗? 我打印出来不对
追答
打印这个看看 client_addr.sin_addr.S_un.S_addr。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询