资源描述
四 川 大 学 计 算 机 学 院、软 件 学 院
实 验 报 告
课程名称
信息安全产品开发实践
实验课时
5
实验项目
Socket编程
实验时间
2011年9月15号
实验目的
1) 继续了解Linux下C语言程序开发的过程
2) 了解Socket网络编程
3) 了解大端机器和小端机器
4) 了解服务器与客户端的通信原理
5) 了解常用套接字函数使用
6) 了解如何用TCP和UDP编写程序实现服务器与客户端的通信
实验环境
VMware5.0,RedHat Linux 9.0
实验内容(算法、程序、步骤和方法)
• 实验一:结合big-endian和little-endian的概念编写一个程序,判断自己试验用机的字节存储结构;
具体步骤:
(1):在Linux下编写测试程序Example.c
#include<stdio.h>
union lg
{
short int i;
char c[2];
} ;
int main()
{
union lg example;
example.i = 1;
printf(“%d\n”,example.char[1]);
}
(2)使用命令gcc –o Example Example.c –g编译;./Example输出结果如下:
(3):分析结果
打印出来的结果是0,说明数组c的第2元素存储的是0,即整型i在内存中的二进制存储顺序为00000001 00000000符合小端机器的定义,故本机是小端机器。
• 实验二:在老师给出的事例程序的基础上 ,才用数据报的方式改写客户端与服务器端程序,实现一个与实例程序相同的网络通讯程序。
具体步骤:
(1):在Linux编写服务器端程序TCPserver.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int server_sockfd;
int client_sockfd;
int len;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int sin_size;
char buf[BUFSIZ];
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_addr.s_addr=INADDR_ANY;
my_addr.sin_port=htons(8000);
if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}
listen(server_sockfd,10);
sin_size=sizeof(struct sockaddr_in);
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("accept");
return 1;
}
printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr));
len=send(client_sockfd,"Hello,\n",10,0);
while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))
{
buf[len]='\0';
printf("%s\n",buf);
if(send(client_sockfd,buf,len,0)<0)
{
perror("write");
return 1;
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
(2):使用gcc –o TCPserver TCPserver.c –g命令编译
(接上)
实验内容(算法、程序、步骤和方法)
(3):编写客户端程序:TCPclient.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int client_sockfd;
int len;
struct sockaddr_in remote_addr;
char buf[BUFSIZ];
memset(&remote_addr,0,sizeof(remote_addr));
remote_addr.sin_family=AF_INET;
remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
remote_addr.sin_port=htons(8000);
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
perror("connect");
return 1;
}
printf("connected to server\n");
len=recv(client_sockfd,buf,BUFSIZ,0);
buf[len]='\0';
printf("%s",buf);
while(1)
{
printf("Enter string to send:");
scanf("%s",buf);
if(!strcmp(buf,"quit")
break;
len=send(client_sockfd,buf,strlen(buf),0);
len=recv(client_sockfd,buf,BUFSIZ,0);
buf[len]='\0';
printf("received:%s\n",buf);
}
close(client_sockfd);
return 0;
}
(4): 使用gcc –o TCPclient TCPclient.c –g命令编译
(5):执行服务器端代码(./TCPserver),客户端连接服务器(./TCPclient 127.0.0.1):
(6):客户端输入字符串nice to meet you,服务器端正确收到数据:
(7):客户端继续输入字符串byebye,服务器端正确接收
(8):客户端输入quit命令,断开连接,服务器正确反应,与客户端脱离连接
数据记录
和计算
详细见上面
结 论
(结 果)
(1):经过验证本机是小端机器。
(2):使用套接字能实现主机之间的网络通信,且有TCP和UDP两种形式。
小 结
通过本实验,我掌握了:
1) 进一步熟悉了Linux下C语言程序开发的过程
2) 初步了解Socket网络编程
3) 了解了什么是大端机器和小端机器,并能进行判断一台机器是大端的还是小端的
4) 了解了服务器与客户端的通信原理
5) 会使用一些基本的套接字函数
目前我存在的问题有:
套接字的函数比较繁琐,掌握的不是很熟练。
指导老师评 议
成绩评定: 指导教师签名:
实验报告说明
专业实验中心
实验名称 要用最简练的语言反映实验的内容。如验证某程序、定律、算法,可写成“验证×××”;分析×××。
实验目的 目的要明确,要抓住重点,可以从理论和实践两个方面考虑。在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
实验环境 实验用的软硬件环境(配置)。
实验内容(算法、程序、步骤和方法) 这是实验报告极其重要的内容。这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。
数据记录和计算 指从实验中测出的数据以及计算结果。
结论(结果) 即根据实验过程中所见到的现象和测得的数据,作出结论。
小结 对本次实验的体会、思考和建议。
备注或说明 可写上实验成功或失败的原因,实验后的心得体会、建议等。
注意:
· 实验报告将记入实验成绩;
· 每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
展开阅读全文