网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
Winsock编程宝典
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
, &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 (画面左边最小化者)。Server 所用的 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 视窗亦可观察到相互连接的 Sockets 资料,与我们呼叫函式所得结果相同)

(图 1)利用 hello 程式来模拟 Client 和 Server

  读者必须注意一点,getsockname() 及 getpeername() 所取得的 IP 位址及 port
number 都是 network byte order,而不是 host byte order;如果您想转成 host byte
order,就必须借助 ntohl() 及 ntohs() 两个函式。而我们能看到 IP 位址以「字串」方式表达出来,则又是利用了 inet_ntoa() 函式;相对地,我们也可利用 inet_addr() 函式将字串方式的 IP 位址转换成 in_addr 格式(network byte order 的 unsigned long)。

◎ inet_ntoa():将一网路位址转换成「点格式」字串。
格式: char FAR * PASCAL FAR inet_ntoa( struct in_addr in );
参数: in 一个代表 Internet host 位址的结构
传回值: 成功 - 一个代表位址的「点格式」(dotted) 字串
失败 - NULL
说明: 此函式将一 Internet 位址转换成「a.b.c.d」字串格式。

◎ inet_addr():将字串格式的位址转换成 32 位元 in_addr 的格式。
格式: unsigned long PASCAL FAR inet_addr( const char FAR *cp );
参数: cp 一个代表 IP 位址的「点格式」(dotted) 字串
传回值: 成功 - 一个代表 Internet 位址的 unsigned long
失败 - INADDR_NONE
说明: 此函式将一「点格式」的位址字串转换成适用之 Intenet 位址。
「点格式」字串可为以下四种方式之任一:
(i) a.b.c.d (ii) a.b.c (iii) a.b (iv) a

图1的 hello 程式中,我们将 Local 资料写到 dispmsg 中,再显示出来;其用法如下:

wsprintf((LPSTR)dispmsg, "OK! local ip=%s, local port=%d",
inet_ntoa(sa.sin_addr), ntohs(sa.sin_por

  • 下一篇资讯: WINSOCK 1.1教程
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号