简单的服务器/客户端程序

时间:2022-04-20 02:34:00

1.计算机网络
    2.IP地址
    3.协议
    4.网络体系结构
    5.TCP/IP体系结构与特点
    6.客户机/服务器模式
    7.TCP/IP特点
    8.套接字的引入
    9.面向 连接/无连接 的套接字的系统调用时序图/流程图

一。程序运行效果图

简单的服务器/客户端程序

二。程序源代码

[cpp]  

 

 

// server.cpp  

  

#include <iostream>  

#include <cstdio>  

#include <Winsock2.h>  

  

using namespace std;  

  

int main()  

{  

// 加载socket动态链接库(dll)  

    WORD wVersionRequested;  

    WSADATA wsaData;    // 这结构是用于接收Wjndows Socket的结构信息的  

    int err;  

       

    wVersionRequested = MAKEWORD( 1, 1 );   // 请求1.1版本的WinSock库  

       

    err = WSAStartup( wVersionRequested, &wsaData );  

    if ( err != 0 ) {  

        return -1;          // 返回值为零的时候是表示成功申请WSAStartup  

    }  

       

    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {  

        // 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本  

        // 否则的话,调用WSACleanup()清除信息,结束函数  

        WSACleanup( );  

        return -1;   

    }  

      

// 创建socket操作,建立流式套接字,返回套接字号sockSrv  

    // SOCKET socket(int af, int type, int protocol);  

    // 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)  

    // 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)  

    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);     

  

// 套接字sockSrv与本地地址相连  

    // int bind(SOCKET s, const struct sockaddr* name, int namelen);  

    // 第一个参数,指定需要绑定的套接字;  

    // 第二个参数,指定该套接字的本地地址信息,该地址结构会随所用的网络协议的不同而不同  

    // 第三个参数,指定该网络协议地址的长度  

    // PS: struct sockaddr{ u_short sa_family; char sa_data[14];};  

    //                      sa_family指定该地址家族, sa_data起到占位占用一块内存分配区的作用  

    //     在TCP/IP中,可使用sockaddr_in结构替换sockaddr,以方便填写地址信息  

    //