通信网络编程第二次作业

1、 NAT是什么?如何实现?
NAT:网络地址转换(Network Address Translation)
当在专用网络内部的一些主机本来已经分配到了本地IP地址,但又想和因特网上的主机通信时,可以使用NAT方法。
一共有三种实现方法:
1. 静态转换:将内部网络的私有IP 地址转换为共有IP地址,IP地址是一对一的,是一成不变的,某个私有IP地址只转换为某个共有IP地址;
2. 动态转换:将内部网络的私有IP地址转换为共有IP地址时,IP地址是不确定的,是随机的,所有被授权访问Internet上的私有IP地址,可随机转换为任何指定的合法IP地址;
3. 端口多路复用:只改变外出数据包和源端口进行端口转换,即:端口地址转换,采用端口多路复用方式。
2、 请编写C程序,实现文件复制功能,要求源文件和目标文件均通过命令行参数传入。

#include 
#include 
int copyFile(char *fileRead, char *fileWrite);
int main(){
    char fileRead[100];  // 要复制的文件名
    char fileWrite[100];  // 复制后的文件名

    // 获取用户输入
    printf("要复制的文件:");
    scanf("%s", fileRead);
    printf("将文件复制到:");
    scanf("%s", fileWrite);
    // 进行复制操作
    if( copyFile(fileRead, fileWrite) ){
        printf("恭喜你,文件复制成功!\n");
    }else{
        printf("文件复制失败!\n");
    }
    return 0;
}
/**
* 文件复制函数
* @param    fileRead    要复制的文件
* @param    fileWrite   复制后文件的保存路径
* @return   int         1: 复制成功;2: 复制失败
**/
int copyFile(char *fileRead, char *fileWrite){
    FILE *fpRead;  // 指向要复制的文件
    FILE *fpWrite;  // 指向复制后的文件
    int bufferLen = 1024*4;  // 缓冲区长度
    char *buffer = (char*)malloc(bufferLen);  // 开辟缓存
    int readCount;  // 实际读取的字节数
    if( (fpRead=fopen(fileRead, "rb")) == NULL || (fpWrite=fopen(fileWrite, "wb")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        getch();
        exit(1);
    }
    // 不断从fileRead读取内容,放在缓冲区,再将缓冲区的内容写入fileWrite
    while( (readCount=fread(buffer, 1, bufferLen, fpRead)) > 0 ){
        fwrite(buffer, readCount, 1, fpWrite);
    }
    free(buffer);
    fclose(fpRead);
    fclose(fpWrite);
    return 1;
}

3、 在C/S结构中客户端通常是窗体应用程序,什么情况下考虑采用向导式窗体设计程序?
Windows窗体的一些重要特点如下:
1. 简单强大:Windows窗体可用于设计窗体和可视控件,以创建丰富的基于Windows的应用程序。
2. 新的数据提供程序管理:数据提供程序管理提供易于连接OLEDB和ODBC数据源的数据控件,包括Microsoft SQL Server、Microsoft Access、Jet、DB2以及Oracle等。
3. 安全:Windows窗体充分利用公共语言运行库的安全特性。这就意味着,一切都可以通过Windows窗体来实现,包括在浏览器中运行的不可信控件和用户硬盘上安装的完全可信的应用程序。
4. 灵活的控件:Windows窗体提供了一套丰富的控件,并且开发人员可以定义自己有特色的新的控件。WinForm控件是指以输入或操作数据的对象。比如ComponentOne是.net平台下对数据和方法的封装。有自己的属性和方法。属性是控件数据的简单访问者。方法则是控件的一些简单而可见的功能。包含在 .NET Framework 中的 Windows窗体类旨在用于 GUI 开发。您可以轻松创建具有适应多变的商业需求所需的灵活性的命令窗口、按钮、菜单、工具栏和其他屏幕元素。方便的数据显示和操作:应用程序开发中最常见的情形之一是在窗体上显示数据。Windows窗体对数据库处理提供全面支持。可以访问数据库中的数据,并在窗体上显示和操作数据。
5. 向导:向用户提供创建窗体、数据处理、打包和部署等的分布指导。
4、 B/S结构中的B指的是什么?S又是什么?
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装SQL Server、Oracle、MYSQL等数据库。浏览器通过Web Server 同数据库进行数据交互。
5、 P2P结构的应用主要特点是什么?
1. 非中心化;
2. 可扩展性;
3. 健壮性;
4. 自治性;
5. 高性价比;
6. 负载均衡;
7. 隐私保护;
6、 在C语言中条件编译语句有哪些?。

1.  # 空指令,无任何效果;
2.  #include 包含一个源代码文件;
3.  #define 宏定义;
4.  #undef 取消已定义的宏;
5.  #if 如果给定的条件为真,则编译;
6.  #ifdef 如果宏已定义,则编译;
7.  #ifndef 如果宏没有定义,则编译;
8.  #elif 如果前面的#if给定的条件为假,当前条件为真,则编译;
9.  #endif 结束一个#if …… #else条件编译块;
10. #error 停止编译,并显示错误信息。

7、 头文件为什么要包含在#ifndef、#define和#endif中?
这种语句为条件编译
1. 避免头文件的重复定义;
2. 起到开关作用,可以方便地取消代码块;
3. 减少程序的内存空间占用,使程序在不同条件下执行不同的功能。
8、后缀名cpp的文件是用C++语法编译,后缀名为c是用C语言语法编译。
9、在cpp文件中如何调用c文件中定义的函数?并说明理由。
使用

extern “C{

}声明
理由:
cpp文件的编译语法是C++语法,c文件的编译是C语言语法
两种文件的编译语法不同,因此需要采用特定的方式进行声明。

10、C语言中的自定义类型有哪些?
结构体、共用体、枚举
11、使用文本串作为通信软件传输内容的格式,有何特点?目前软件开发常用的文本串格式有哪些?
常用文本串结构:XML、JSON
文本串作为通信软件传输内容的格式特点:
1. 可读性可扩展性好;
2. 数据格式比较简单,易于读写、解析,格式都是压缩的,占用带宽小;
3. 容易与其他系统进行远程交互,数据共享比较方便;
参考:https://zhidao.baidu.com/question/1692872665487250108.html
12、说明静态库和动态库的区别。
window操作系统中:
静态库:以.dll结尾
动态库:以.lib结尾
Linux操作系统中:
静态库:以.a结尾
动态库:以.so结尾
静态库与动态库的不同:
动态库与静态库的不同在于代码被载入的时刻不同,静态库的代码在编译过程中已被载入可执行程序,因此生成的目标文件内存占用较大;动态库的代码是在可执行程序运行时才被载入内存的,在编译过程中仅仅是简单的引用,因此代码的内存占用较小。
13、使用C语言编写网络通信程序需要注意哪些问题?
1. 整数的长度与符号;
2. 字节顺序;
3. 结构对齐与填充;
4. 网络数据传输形态;
5. 字符编码;
6. 数据校验。
14、字节对齐在C语言中的主要作用是什么?如何设置字节对齐模式?
作用:
1. 各种硬件平台对存储空间的处理上有很大的不同;
2. 利用字节对齐可以提高存取效率。
设置字节对齐的模式:
使用#pragma pack(参数)设置字节对齐方式;
直接在结构体定义中使用“:”指定占用内存的大小。
15、TCP/IP socket编程需要用到哪些与套接字有关的文件,各起什么作用?
winsock.h:
套接字API的头文件,使用#include包含后可以直接调用socket网络函数接口;
ws2_32.lib:
静态链接库文件,应用程序载入动态库可以调用相关支持的API;
ws2_32.dll:
动态链接库文件,应用程序在执行时通过载入动态库实现网络通信功能。

你可能感兴趣的:(C语言基础知识)