概述
本篇文章是对网络编程课程的上机记录笔记,本节是在实验1基础上的拓展,增加了修改udp服务器端代码的内容。
实验要求:根据udp服务器端的代码,使用getsockname()函数,修改代码,使其运行出来的结果如下图:
相关代码资源可在:https://github.com/patrikarlos?tab=repositories.中获得
实验过程
1.首先,让我们在c++编译器中打开代码,方便调试。(这里用的是xcode)
2.定位到需要更改的语句
就是你啦!
3.内心明确,要改的内容:
这里要输出本地地址:当前服务器的端口号
0.0.0.0:4950
4.更改后的代码为:
getsockname(sockfd,(struct sockaddr*)&local_sin, &local_sinlen);
myAdd = inet_ntop(local_sin.sin_family, &local_sin.sin_addr, myAddress, sizeof(myAddress));
printf("Listening on %s:%d\n", myAdd, ntohs(local_sin.sin_port));
printf("listener: waiting to recvfrom...\n");
注意使用getsockname()函数,该函数得到一个类型为sockaddr*的结构体,该结构体中存储了有关在服务器上监听的这个套接字local_sin的信息。
虽然此时local_sin的sin_addr中存储的的是当前主机的地址,但是,由于计算机内部的编码规律,此时的它还是一个网络字节序,即计算机内部的一个我们看不懂的地址信息。要解决这个问题,我们需要用inet_ntop()函数将其转换为xx.xx.xx.xx这类人类看得懂的网络地址表现形式。
在经过了上述操作后,变量myAdd中就成功存储了当前服务器的地址,同时,我们来转变一下服务器的端口地址,即ntohs(local_sin.sin_port)。这样就成功输出啦。
5.还不错吧!
6.下一个修改是修改服务器,使其也打印十六进制转储消息。这样,消息就像往常一样被打印,然后是消息的十六进制转储。使用“%0x”在printf()中格式化输出。例如;
示例代码:
for(int i=0; i<numbytes;i++){
printf("%0x ", buf[i]);
}
仍在思考,尚未解决。