VC 为什么我获取客户端ip地址总是:204.204.204.204
Socket接受连接时可以用一个Sockaddr_in结构来接收发送方的地址,例子如下:sockaddr_in*addr=newsockaddr_in;CStringad...
Socket接受连接时可以用一个Sockaddr_in结构来接收发送方的地址,例子如下:
sockaddr_in *addr=new sockaddr_in;
CString address;
Accept(*Connect,(sockaddr *)addr,&len);
address=inet_ntoa(addr->sin_addr);
此时address中就是对方的IP。
我用MessageBox(address);
显示总是:204.204.204.204 不知道是为什么?
用getpeername(.......)函数得到的结果也是一样~!
先谢了~!!! 展开
sockaddr_in *addr=new sockaddr_in;
CString address;
Accept(*Connect,(sockaddr *)addr,&len);
address=inet_ntoa(addr->sin_addr);
此时address中就是对方的IP。
我用MessageBox(address);
显示总是:204.204.204.204 不知道是为什么?
用getpeername(.......)函数得到的结果也是一样~!
先谢了~!!! 展开
3个回答
推荐于2016-10-01
展开全部
简单的 Winsock 应用程式设计
struct sockaddr_in sa;
int salen = sizeof(sa);
getsockname( sd, (struct sockaddr FAR *)&sa, &salen )
【如何知道和我们的 Socket 连接的对方是谁】
连接的 Socket 是有两端的,所以相对於 getsockname() 函式,Winsock 也提
供了一个 getpeername() 函式,来让我们获得与我们连接的对方的 IP 位址与
port
number。
◎ getpeername():获取连接成功之 Socket 的对方 IP 位址及 port number。
格 式: int PASCAL FAR getpeername( SOCKET s,
struct sockaddr FAR *name, int FAR *namelen );
参 数: s Socket 的识别码
name 储存与此 Socket 连接的对方 IP 位址的暂存区
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。
呼叫的方式如下:
struct sockaddr_in sa;
int salen = sizeof(sa);
getpeername( sd, (struct sockaddr FAR *)&sa, &salen )
现在我们仍然利用 WinKing 来当我们的 Winsock Stack,并利用它所提供的
工具来观察 Sockets 的连结及资料是否正确。
由图 1,我们可以由 WinKing 的视窗看到我们设定这台主机的名称是
「vincent」,IP 位址是 「140.92.61.24」。我们并利用两个 hello 程式,一
个当
成 Client (画面右边打开者),一个当成 Server (画面左边最小化者)。Se
rver
所用的 port number 是 「7016」; Client 并没有呼叫 bind() 来指定 port
number,而是呼叫 connect() 时由系统指定。
我们呼叫 gethostname(),得到的答案是 「vincent」;而 Client 呼叫
getsockname() 得到自己的 IP 位址是 「140.92.61.24」,port number 是 「
2110」
(笔者以前曾提过,由系统主动指定的 port number 会介於 1024 到 5000 间)
;
再呼叫 getpeername() 得到与 Client 连接的 Server 端 IP 位址是 「140.92
.61.24」
(因为我们的 Client 和 Server 都在同一台主机),port number 是 「7016」
。果
然没错!(由 WinKing 的 Sockets' Status 视窗亦可观察到相互连接的 Socke
ts 资
料,与我们呼叫函式所得结果相同)
struct sockaddr_in sa;
int salen = sizeof(sa);
getsockname( sd, (struct sockaddr FAR *)&sa, &salen )
【如何知道和我们的 Socket 连接的对方是谁】
连接的 Socket 是有两端的,所以相对於 getsockname() 函式,Winsock 也提
供了一个 getpeername() 函式,来让我们获得与我们连接的对方的 IP 位址与
port
number。
◎ getpeername():获取连接成功之 Socket 的对方 IP 位址及 port number。
格 式: int PASCAL FAR getpeername( SOCKET s,
struct sockaddr FAR *name, int FAR *namelen );
参 数: s Socket 的识别码
name 储存与此 Socket 连接的对方 IP 位址的暂存区
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。
呼叫的方式如下:
struct sockaddr_in sa;
int salen = sizeof(sa);
getpeername( sd, (struct sockaddr FAR *)&sa, &salen )
现在我们仍然利用 WinKing 来当我们的 Winsock Stack,并利用它所提供的
工具来观察 Sockets 的连结及资料是否正确。
由图 1,我们可以由 WinKing 的视窗看到我们设定这台主机的名称是
「vincent」,IP 位址是 「140.92.61.24」。我们并利用两个 hello 程式,一
个当
成 Client (画面右边打开者),一个当成 Server (画面左边最小化者)。Se
rver
所用的 port number 是 「7016」; Client 并没有呼叫 bind() 来指定 port
number,而是呼叫 connect() 时由系统指定。
我们呼叫 gethostname(),得到的答案是 「vincent」;而 Client 呼叫
getsockname() 得到自己的 IP 位址是 「140.92.61.24」,port number 是 「
2110」
(笔者以前曾提过,由系统主动指定的 port number 会介於 1024 到 5000 间)
;
再呼叫 getpeername() 得到与 Client 连接的 Server 端 IP 位址是 「140.92
.61.24」
(因为我们的 Client 和 Server 都在同一台主机),port number 是 「7016」
。果
然没错!(由 WinKing 的 Sockets' Status 视窗亦可观察到相互连接的 Socke
ts 资
料,与我们呼叫函式所得结果相同)
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,IP...
点击进入详情页
本回答由Storm代理提供
展开全部
Winsock 应用程式设计
struct sockaddr_in sa;
int salen = sizeof(sa);
getsockname( sd, (struct sockaddr FAR *)&sa, &salen )
【如何知道 Socket 连接的对方是谁】
连接的 Socket 是有两端的,所以相对於 getsockname() 函式,Winsock 也提
供了一个 getpeername() 函式,来让我们获得与我们连接的对方的 IP 位址与
port
number。
◎ getpeername():获取连接成功之 Socket 的对方 IP 位址及 port number。
格 式: int PASCAL FAR getpeername( SOCKET s,
struct sockaddr FAR *name, int FAR *namelen );
参 数: s Socket 的识别码
name 储存与此 Socket 连接的对方 IP 位址的暂存区
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。
呼叫的方式如下:
struct sockaddr_in sa;
int salen = sizeof(sa);
getpeername( sd, (struct sockaddr FAR *)&sa, &salen )
现在仍然利用 WinKing 来当 Winsock Stack,并利用它所提供的
工具来观察 Sockets 的连结及资料是否正确。
由图 1,我们可以由 WinKing 的视窗看到我们设定这台主机的名称是
「vincent」,IP 位址是 「140.92.61.24」。我们并利用两个 hello 程式,一
个当
成 Client (画面右边打开者),一个当成 Server (画面左边最小化者)。Se
rver
所用的 port number 是 「7016」; Client 并没有呼叫 bind() 来指定 port
number,而是呼叫 connect() 时由系统指定。
呼叫 gethostname(),得到的答案是 「vincent」;而 Client 呼叫
getsockname() 得到自己的 IP 位址是 「140.92.61.24」,port number 是 「
2110」
(笔者以前曾提过,由系统主动指定的 port number 会介於 1024 到 5000 间);
再呼叫 getpeername() 得到与 Client 连接的 Server 端 IP 位址是 「140.92
.61.24」
(因为我们的 Client 和 Server 都在同一台主机),port number 是 「7016」
。果
然没错!(由 WinKing 的 Sockets' Status 视窗亦可观察到相互连接的 Socke
ts 资
料,与呼叫函式所得结果相同)
struct sockaddr_in sa;
int salen = sizeof(sa);
getsockname( sd, (struct sockaddr FAR *)&sa, &salen )
【如何知道 Socket 连接的对方是谁】
连接的 Socket 是有两端的,所以相对於 getsockname() 函式,Winsock 也提
供了一个 getpeername() 函式,来让我们获得与我们连接的对方的 IP 位址与
port
number。
◎ getpeername():获取连接成功之 Socket 的对方 IP 位址及 port number。
格 式: int PASCAL FAR getpeername( SOCKET s,
struct sockaddr FAR *name, int FAR *namelen );
参 数: s Socket 的识别码
name 储存与此 Socket 连接的对方 IP 位址的暂存区
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。
呼叫的方式如下:
struct sockaddr_in sa;
int salen = sizeof(sa);
getpeername( sd, (struct sockaddr FAR *)&sa, &salen )
现在仍然利用 WinKing 来当 Winsock Stack,并利用它所提供的
工具来观察 Sockets 的连结及资料是否正确。
由图 1,我们可以由 WinKing 的视窗看到我们设定这台主机的名称是
「vincent」,IP 位址是 「140.92.61.24」。我们并利用两个 hello 程式,一
个当
成 Client (画面右边打开者),一个当成 Server (画面左边最小化者)。Se
rver
所用的 port number 是 「7016」; Client 并没有呼叫 bind() 来指定 port
number,而是呼叫 connect() 时由系统指定。
呼叫 gethostname(),得到的答案是 「vincent」;而 Client 呼叫
getsockname() 得到自己的 IP 位址是 「140.92.61.24」,port number 是 「
2110」
(笔者以前曾提过,由系统主动指定的 port number 会介於 1024 到 5000 间);
再呼叫 getpeername() 得到与 Client 连接的 Server 端 IP 位址是 「140.92
.61.24」
(因为我们的 Client 和 Server 都在同一台主机),port number 是 「7016」
。果
然没错!(由 WinKing 的 Sockets' Status 视窗亦可观察到相互连接的 Socke
ts 资
料,与呼叫函式所得结果相同)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的电脑出 故障了 排除 故障就 OK了 呵呵~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |