计算机系统平台实验——面向连接的客户端程序设计(可显示文件中存储内容)


实验目的

实验目的:熟悉网络程序接口,了解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的分享
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值