首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • 成都信息工程学院计算机网络课程实验三

    时间:2021-02-19 12:04:35 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:成都 计算机网络 信息工程学院

    成都信息工程学院计算机网络课程实验三 本文关键词:成都,计算机网络,信息工程学院,课程,实验

    成都信息工程学院计算机网络课程实验三 本文简介:计算机网络实验报告实验三:编写客户服务器程序班级xxxxx姓名xxxxxxxxxxxxx学号xxxxxxxxx日期xxxxxxxx一、实验目的:学习TCP/UDP协议套接字编程,深入理解客户服务器程序的原理,以及端口作用等。二、实验内容编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的

    成都信息工程学院计算机网络课程实验三 本文内容:

    计算机网络

    实验报告

    实验三:编写客户服务器程序

    班级

    xxxxx

    姓名

    xxxxxxxxxxxxx

    学号

    xxxxxxxxx

    日期

    xxxxxxxx

    一、

    实验目的:

    学习TCP/UDP协议套接字编程,深入理解客户服务器程序的原理,以及端口作用等。

    二、

    实验内容

    编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的信息,立即回送回去。

    客户机等待用户输入信息,然后发送给服务器。并接受服务器回送回来的信息。所有的信息均需显示在屏幕上。

    三、

    程序实现设计方法

    编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的信息,立即送回去。

    客户机等待用户输入信息,然后发送给服务器。并接受服务器回送回来的信息。所有的信息均需显示在屏幕上。

    可以每2个人一组,一个负责服务器端,一个负责客户端。(自己协商使用udp还是tcp方式,端口号)

    上机实验过程:

    1、启动winXP,运行vc程序

    2、新建一个文件,录入编辑好的服务器程序或客户程序

    3、分别以server.c或client.c保存

    4、打开build/compile菜单,系统会自动建立一个新的工程,然后完成编译工作

    5、打开project/settings.菜单,在对话框的link标签下,找到project

    options:编辑框,在其中添加“WS2_32.LIB”

    6、打开build/build菜单,系统生成执行程序server.exe或client.exe

    7、分别运行server.exe,client.exe,观察两个程序运行结果

    四、

    源程序

    服务器端程序

    /****************************************************Windows环境下使用VC编写的TCP通信服务器端程序在编译这个程序时,需要在工程设置项目--〉连接项目中添加如下两项:

    Ws2_32.lib和Winmm.lib否则编译后链接生成可执行文件时会出错!服务器程序在单机内的测试运行方法:

    server

    [监听端口:缺省为9999]程序中的函数列表:int

    InitSockets(void):

    插口(套接字)初始化void

    ServeAClient(LPVOID

    lpv):为客户提供服务的函数int

    ServerLoop(SOCKET

    sd_listen,int

    isMultiTasking):

    服务器循环函数,服务期间总是在这个函数中循环********************************************************/

    #include

    #include

    #include

    /*

    由于Winsock目前有两个版本:2.2和1.1,所以我们首先必须判断系统所支持的Winsock版本,这就要靠WSAStartup函数了。

    另外还有一个WSACleanup函数,这两个函数是Winsock编程必须调用的,其中WSAStartup函数的功能是初始化Winsock

    DLL,因为在Windows下,Socket是以DLL的形式实现的。1.1版本的DLL为Winsock.dll,而2.2版本的DLL则为Wsock32.dll,其中在2.2版本的系统中,对Winsock1.1函数的调用会由Wsock32.dll自动映射到Winsock.dll。WSAStartup函数的功能就是初始化DLL,其函数原型为:

    int

    WSAStartup

    (WORD

    wVersionRequested,LPWSADATA

    lpWSAData);

    其第一个参数为你所想需要的Winsock版本!低字节为主版本,高字节为副版本!由于目前Winsock有两个版本:1.1和2.2,因此该参数可以是0x101或0x202;第2个参数是一个WSADATA结构,用于接收函数的返回信息!WSAStartup函数调用成功会返回0,否则返回非0值!

    由于Win

    95,WinNT4自带的Winsock是1.1版本的,所以如果你的程序是基于Winsock2.2的,那很可能无法在上面运行。因此,如果你希望你写的程序被所有Windows平台支持的话,最好将其声明成1.1版的,不过这样将无法使用很多Winsock2.2才有的特性!至于WSACleanup的用法很简单,用“WSACleanup();”就行了!另外,在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup!/

    int

    InitSockets(void)

    {

    WSADATA

    wsaData;

    WORD

    wVersionRequested;

    int

    err;

    /*

    Ask

    for

    Winsock

    1.1

    functionality/

    wVersionRequested

    =

    MAKEWORD(

    1,1

    );

    err

    =

    WSAStartup(

    wVersionRequested,if

    (

    err

    !=

    0

    )

    {

    printf(“Error

    %d:

    Winsock

    not

    available/n“,err);

    return

    1;

    }

    return

    0;

    }

    #define

    WSA_ERROR(x)

    {

    printf(“Error

    %d:

    %s/n“,/

    WSAGetLastError(),x);

    return

    1;

    }

    int

    ServerLoop(SOCKET

    sd_listen,int

    isMultiTasking);

    main(int

    argc,char*argv)

    {

    SOCKET

    sd_listen;

    int

    err;

    u_short

    iPort;

    struct

    sockaddr_in

    addr_srv;

    struct

    hostentptrHost;

    iPort

    =

    (argc

    >=

    2)

    ?

    atoi(argv[1])

    :

    9999;//从命令行中提取服务器监控的端口号,如果命令行没有带数字格式的端口号,则定为9999

    InitSockets();//初始化套接字

    /*

    创建套接字有两个函数,socket和WSASocket,前者是标准的Socket函数,而后者是微软对Socket的扩展函数。socket函数有3个参数,第一个是指定通信发生的区域,在UNIX下有AF_UNIX、AF_INET、AF_NS等,而在Winsock1.1下只支持AF_INET,到了2.2则添了AF_IRDA(红外线通信)、AF_ATM(异步网络通信)、AF_NS、AF_IPX等;第2个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。socket函数调用成功返回一个套接字描述符,错误则返回SOCKET_ERROR。/

    sd_listen

    =

    socket(PF_INET,SOCK_STREAM,0);

    if

    (sd_listen

    ==

    INVALID_SOCKET)

    {

    printf(“Error:

    out

    of

    socket

    resources/n“);

    return

    1;

    }

    /*

    接下来要为服务器端定义的这个监听的socket指定一个地址及端口(Port),这样客户端才知道要连接哪一个地址的哪个端口,为此我们首先设置数据结构struct

    sockaddr中的参数,随之调用bind()函数将socket邦定在指定的端口和地址上,该函数调用成功返回0,否则返回SOCKET_ERROR。sockaddr_in结构的sin_addr.s_addr成员被设置为INADDR_ANY,意味着由操作系统给socket自动指定一个最有效的IP地址。/

    addr_srv.sin_family

    =

    PF_INET;

    addr_srv.sin_addr.s_addr

    =

    htonl(INADDR_ANY);

    addr_srv.sin_port

    =

    htons(iPort);

    err

    =

    bind(sd_listen,(const

    struct

    sockaddr)

    if

    (err

    ==

    INVALID_SOCKET)

    WSA_ERROR(“Error:

    unable

    to

    bind

    socket/n“)

    /*

    当服务器端的Socket对象绑定完成之后,服务器端必须通知操作系统为这个socket建立一个监听队列来接收客户端的连接请求。listen()函数使服务器端的Socket

    进入监听状态,并设定可以建立的最大连接数。该函数调用成功返回0,否则返回SOCKET_ERROR。/

    err

    =

    listen(sd_listen,SOMAXCONN);

    if

    (err

    ==

    INVALID_SOCKET)

    WSA_ERROR(“Error:

    listen

    failed/n“)

    //程序进入服务循环函数

    ServerLoop(sd_listen,1);

    printf(“Server

    is

    down/n“);

    WSACleanup();

    return

    0;

    }

    /*

    如果客户端发来HELLO

    SERVER,

    那么服务器端将回送HELLO

    CLIENT,

    不符合的输入,服务器端将没有响应/

    void

    ServeAClient(LPVOID

    lpv)

    {

    SOCKET

    sd_accept

    =

    (SOCKET)

    lpv;

    const

    charmsg

    =

    “HELLO

    CLIENT“;

    char

    response[4096];

    memset(response,0,sizeof(response));

    recv(sd_accept,response,sizeof(response),0);

    if

    (strcmp(response,“HELLO

    SERVER“))

    {

    printf(“Application:

    client

    not

    using

    expected

    ““protocol

    %s/n“,response);

    }

    else

    send

    (sd_accept,msg,strlen(msg)+1,0);

    closesocket(sd_accept);

    }

    #define

    MAX_SERVED

    3

    //服务器端的循环函数,服务期间总是在这个函数中运行

    int

    ServerLoop(SOCKET

    sd_listen,int

    isMultiTasking)

    {

    SOCKET

    sd_accept;

    struct

    sockaddr_in

    addr_client;

    int

    err,nSize;

    int

    numServed

    =

    0;

    HANDLE

    handles[MAX_SERVED];

    int

    myID;

    //主循环体,服务期间总是在这个结构内循环

    while

    (numServed

    #include

    int

    InitSockets(void)

    {

    WSADATA

    wsaData;

    WORD

    wVersionRequested;

    int

    err;

    /*

    Ask

    for

    Winsock

    1.1

    functionality/

    wVersionRequested

    =

    MAKEWORD(

    1,1

    );

    err

    =

    WSAStartup(

    wVersionRequested,if

    (

    err

    !=

    0

    )

    {

    printf(“Error

    %d:

    Winsock

    not

    available/n“,err);

    return

    1;

    }

    return

    0;

    }

    #define

    WSA_ERROR(x)

    {

    printf(“Error

    %d:

    %s/n“,/

    WSAGetLastError(),x);

    return

    1;

    }

    //void

    InitSockets(void);

    main(int

    argc,char*argv)

    {

    SOCKET

    sd_client;

    int

    err;

    u_short

    iPort;

    struct

    sockaddr_in

    addr_srv;

    struct

    hostentptrHost;

    char

    response[4096];

    charpszHost;

    charmsg

    =

    “HELLO

    SERVER“;

    if

    (argc

    ==

    3)

    {

    pszHost

    =

    argv[1];

    iPort

    =

    atoi(argv[2]);

    }

    else

    {

    printf(“Usage:/t

    client1

    [hostname]

    [portno]“);

    return

    1;

    }

    InitSockets();

    sd_client

    =

    socket(PF_INET,SOCK_STREAM,0);

    if

    (sd_client

    ==

    INVALID_SOCKET)

    WSA_ERROR(“no

    more

    socket

    resources“)

    //输入了数字格式的主机名,则直接转换,否则通过gethostbyname获取主机IP

    if

    (atoi(pszHost))

    {

    u_long

    ip_addr

    =

    inet_addr(pszHost);

    ptrHost

    =

    gethostbyaddr((char)

    }

    else

    ptrHost

    =

    gethostbyname(pszHost);

    if

    (!ptrHost)

    WSA_ERROR(“cannot

    resolve

    hostname“)

    addr_srv.sin_family

    =

    PF_INET;

    memcpy((char)

    addr_srv.sin_port

    =

    htons(iPort);

    //向服务器发出连接请求

    err

    =

    connect(sd_client,(struct

    sockaddr)

    if

    (err

    ==

    INVALID_SOCKET)

    WSA_ERROR(“cannot

    connect

    to

    server“)

    printf(“You

    are

    connected

    to

    the

    server/n“);

    //连接上后,向服务器发出服务请求

    send

    (sd_client,msg,strlen(msg)+1,0);

    memset(response,0,sizeof(response));

    //接收服务器返回的服务信息

    recv(sd_client,response,sizeof(response),0);

    printf(“server

    says

    %s/n“,response);

    closesocket(sd_client);

    WSACleanup();

    return

    0;

    }

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识