实验目的
实验目的:熟悉网络程序接口,了解TCP连接,掌握客户端软件设计的基本算法。
实验内容:写一个面向连接的文件服务器的客户端。要求为一个简单的网络文件服务器写一个客户端程序。客户端连接服务器,并提供要接收的文件名,然后显示接受的文件内容。编译好的客户端要求能与该程序通信,提交文件名,然后显示文件的内容。该服务器使用端口号12345。
实验截图
客户端:
服务器端:
实验步骤
(1)在主函数之中建立参数传接端口
(2)定义TCP所需的网络参数,例如IP地址与端口号,配置sockaddr_in结构体。建立socket连接
(3)填写服务器地址信息,定义传输格式,发起对服务器的连接,进行三次握手
(4)使用格式转化获得参数的长度,将参数发送到服务器端
(5)显示参数所代表文件的全部内容
(6)关闭连接,服务器阻塞
源码
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fstream>
#include <iostream>
using namespace std;
#define SERVPORT 12345
int main(int argc,char *argv[]) {
int sockfd,sendbytes;
struct sockaddr_in serv_addr;//需要连接的服务器地址信息
//创建socket,PF_INET 表示地址,SOCK_STREAM 表示TCP
if((sockfd = socket(PF_INET,SOCK_STREAM,0)) < 0) {
perror("socket");
exit(1);
}
//服务器地址信息
serv_addr.sin_family = PF_INET;
serv_addr.sin_port = htons(SERVPORT); //传输层的端口号
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //网络层的IP地址: 实际的服务器IP地址
bzero(&(serv_addr.sin_zero),8); //保留的8字节置零
//发起对服务器的连接信息,进行三次握手,需要将sockaddr_in类型的数据结构强制转换为sockaddr
if((connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))) < 0) {
perror("connect failed!");
exit(1);
}
printf("connect successful! \n");
//发送消息给服务器端
/*if((sendbytes = send(sockfd,"hello",5,0)) < 0) {
perror("send");//若发生错误,则将上一个函数发生错误的原因输出
exit(1);
}*/
int len = strlen((char*)argv[1]);
if((sendbytes = send(sockfd,argv[1],len,0)) < 0) {
perror("send");//若发生错误,则将上一个函数发生错误的原因输出
exit(1);
}
//文件操作
char a;
fstream openfile(argv[1]);
if(!openfile)
{
cout<<"open failed!"<<endl;
exit(1);
}
do{
openfile.get(a);
if(openfile.eof())
break;
cout<<a;
}while(!openfile.eof());
printf("send successful! %d \n",sendbytes);
//关闭
close(sockfd);
}
实验体会
这是我第二次在Linux内核上编译C#代码,有了前几次的经验,我的代码水平有了明显的进步,通过对TCP的学习,我对这次编译胸有成竹。在编写代码之前,我仔细学习了网络程序接口以及TCP连接的相关信息。对服务器五步配置以及客户端的三步配置有了深入的了解,也查询了很多关于客户端与服务器三次握手的相关知识,在对基础知识有了充足储备的情况下,我开始编译代码。首先为了创建一个socket我学会了函数socket(),然后我学习了利用函数connect()建立与服务器的连接,这样就可以与服务器相连,然后我学习了使用send类函数向服务器发送字符,最后关闭网络连接,完成。我为了显示文件的内容,自学了文件操作的一些知识。这次实验使我对TCP通信以及网络程序接口有了初步认识,学会了建立与服务器的网络连接,学会了向服务器发送数据,学会了显示一个文件的全部内容。收获颇丰。
本课程资源包
我整理了本课程一学期的四次实验和作业,带有详解,内含期末复习资料和课件。链接:
链接:https://pan.baidu.com/s/1cvvO_ntbqad5Xa-hbvHZQg
提取码:f2t0
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V1的分享