《网络程序设计》实验指导书
郭建伟
1
实验一 SOCKET基本编程
1、 实验目的
1、掌握使用LINUX环境下GCC编译器的基本方法; 2、掌握SOCKET套接字的基本编程模板;
3、掌握套接字基本编程,掌握点分十进制和网络二进制IP地址之间的转换。 4、通过使用gethostbyname和gethostbyaddr来获取本地和远程用户的地址信息。
2、 实验要求
1、认真阅读和掌握本实验相关的知识点。 2、上机编写运行本程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。 3、 注意事项:
在LINUX系统上为每个用户创建一个目录,专门用于编译和运行实验程序。 4、 实验内容
(1)点分十进制和网络二进制之间的转换 #include
int main (void) {
char *src; const char *ch; int rc;
2
struct in_addr inet_pton_r;
memset(&inet_pton_r,0,sizeof(inet_pton_r)); src = (char *)malloc(20*sizeof(char)); // 输入IP地址
printf(\ scanf(\
//点分十进制地址格式--->网络字序的二进制格式 rc = inet_pton(AF_INET,src,(void *)&inet_pton_r); if (rc > 0) {
printf(\ } else {
perror(\ }
//网络字序的二进制格式--->点分十进制地址格式 ch
=
inet_ntop(AF_INET,(void
*)&inet_pton_r.s_addr,src,INET_ADDRSTRLEN); if (ch == NULL) {
perror(\ } else {
printf(\ } free(src); return 0;
3
}
(2)使用gethostbyname和gethostbyaddr来获取本地和远程用户的地址信息 #include
char *ptr,**pptr; struct hostent *hptr; char str[32]; char ipaddr[16]; struct in_addr *hipaddr;
/* 取得命令后第一个参数,即要解析的IP地址 */ ptr = argv[1];
/* 调用inet_aton(),ptr就是以字符串存放的地方的指针,hipaddr是in_addr形式的地址 */
if(!inet_aton(ptr,hipaddr)) {
printf(\ return 1; }
/* 调用gethostbyaddr()。调用结果都存在hptr中 */ if( (hptr = gethostbyaddr(hipaddr, 4, AF_INET) ) == NULL ) {
printf(\
return 1; /* 如果调用gethostbyaddr发生错误,返回1 */ }
4
/* 将主机的规范名打出来 */
printf(\
/* 主机可能有多个别名,将所有别名分别打出来 */ for(pptr = hptr->h_aliases; *pptr != NULL; pptr++) printf(\ alias:%s\\n\ /* 根据地址类型,将地址打出来 */ switch(hptr->h_addrtype) {
case AF_INET: case AF_INET6: pptr=hptr->h_addr_list;
/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */ for(;*pptr!=NULL;pptr++)
printf(\ address:%s\\n\ break; default:
printf(\ break; } return 0; } (3)
#include
char *ptr,**pptr; struct hostent *hptr;
5