看真人漫画的软件:VC 为什么我获取客户端ip地址总是:204.204.204.204

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/08 14:40:53
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(.......)函数得到的结果也是一样~!
先谢了~!!!

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 资
料,与呼叫函式所得结果相同)

简单的 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 资
料,与我们呼叫函式所得结果相同)

你的电脑出 故障了 排除 故障就 OK了 呵呵~~