zoukankan      html  css  js  c++  java
  • 网络七层架构

    一。程序运行效果图

    二。程序源代码

    三。程序设计相关基础知识

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

     

    一。程序运行效果图

     

    二。程序源代码

    1. // server.cpp  
    2.   
    3. #include <iostream>  
    4. #include <cstdio>  
    5. #include <Winsock2.h>  
    6.   
    7. using namespace std;  
    8.   
    9. int main()  
    10. {  
    11. // 加载socket动态链接库(dll)  
    12.     WORD wVersionRequested;  
    13.     WSADATA wsaData;    // 这结构是用于接收Wjndows Socket的结构信息的  
    14.     int err;  
    15.        
    16.     wVersionRequested = MAKEWORD( 1, 1 );   // 请求1.1版本的WinSock库  
    17.        
    18.     err = WSAStartup( wVersionRequested, &wsaData );  
    19.     if ( err != 0 ) {  
    20.         return -1;          // 返回值为零的时候是表示成功申请WSAStartup  
    21.     }  
    22.        
    23.     if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {  
    24.         // 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本  
    25.         // 否则的话,调用WSACleanup()清除信息,结束函数  
    26.         WSACleanup( );  
    27.         return -1;   
    28.     }  
    29.       
    30. // 创建socket操作,建立流式套接字,返回套接字号sockSrv  
    31.     // SOCKET socket(int af, int type, int protocol);  
    32.     // 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)  
    33.     // 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)  
    34.     SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);     
    35.   
    36. // 套接字sockSrv与本地地址相连  
    37.     // int bind(SOCKET s, const struct sockaddr* name, int namelen);  
    38.     // 第一个参数,指定需要绑定的套接字;  
    39.     // 第二个参数,指定该套接字的本地地址信息,该地址结构会随所用的网络协议的不同而不同  
    40.     // 第三个参数,指定该网络协议地址的长度  
    41.     // PS: struct sockaddr{ u_short sa_family; char sa_data[14];};  
    42.     //                      sa_family指定该地址家族, sa_data起到占位占用一块内存分配区的作用  
    43.     //     在TCP/IP中,可使用sockaddr_in结构替换sockaddr,以方便填写地址信息  
    44.     //   
    45.     //     struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8];};  
    46.     //     sin_family表示地址族,对于IP地址,sin_family成员将一直是AF_INET。  
    47.     //     sin_port指定将要分配给套接字的端口。  
    48.     //     sin_addr给出套接字的主机IP地址。  
    49.     //     sin_zero[8]给出填充数,让sockaddr_in与sockaddr结构的长度一样。  
    50.     //     将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据。  
    51.     //     如果想只让套接字使用多个IP中的一个地址,可指定实际地址,用inet_addr()函数。  
    52.     SOCKADDR_IN addrSrv;  
    53.     addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 将INADDR_ANY转换为网络字节序,调用 htonl(long型)或htons(整型)  
    54.     addrSrv.sin_family = AF_INET;  
    55.     addrSrv.sin_port = htons(6000);  
    56.   
    57.     bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 第二参数要强制类型转换  
    58.   
    59. // 将套接字设置为监听模式(连接请求), listen()通知TCP服务器准备好接收连接  
    60.     // int listen(SOCKET s,  int backlog);  
    61.     // 第一个参数指定需要设置的套接字,第二个参数为(等待连接队列的最大长度)  
    62.     listen(sockSrv, 10);  
    63.   
    64. // accept(),接收连接,等待客户端连接  
    65.     // SOCKET accept(  SOCKET s,  struct sockaddr* addr,  int* addrlen);  
    66.     // 第一个参数,接收一个处于监听状态下的套接字  
    67.     // 第二个参数,sockaddr用于保存客户端地址的信息  
    68.     // 第三个参数,用于指定这个地址的长度  
    69.     // 返回的是向与这个监听状态下的套接字通信的套接字  
    70.   
    71. // 客户端与用户端进行通信  
    72.   
    73.     // send(), 在套接字上发送数据  
    74.     // int send( SOCKET s,  const char* buf,  int len,  int flags);  
    75.     // 第一个参数,需要发送信息的套接字,  
    76.     // 第二个参数,包含了需要被传送的数据,  
    77.     // 第三个参数是buffer的数据长度,  
    78.     // 第四个参数,一些传送参数的设置  
    79.   
    80.     // recv(), 在套接字上接收数据  
    81.     // int recv(  SOCKET s,  char* buf,  int len,  int flags);  
    82.     // 第一个参数,建立连接后的套接字,  
    83.     // 第二个参数,接收数据  
    84.     // 第三个参数,接收数据的长度,  
    85.     // 第四个参数,一些传送参数的设置  
    86.   
    87.     SOCKADDR_IN  addrClient;  
    88.     int len = sizeof(SOCKADDR);  
    89.   
    90.     while(true){    // 不断等待客户端请求的到来  
    91.         SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);  
    92.           
    93.         char sendBuf[100];  
    94.         sprintf(sendBuf, "Welcome %s to the server program~  Now, let's start talking... ", inet_ntoa(addrClient.sin_addr));  
    95.         send(sockConn, sendBuf, strlen(sendBuf)+1, 0);  // 发送显示欢迎信息  
    96.   
    97.         char recvBuf[100];  
    98.         recv(sockConn, recvBuf, 100, 0);  
    99.         printf("%s ", recvBuf);        // 接收第一次信息  
    100.   
    101.         char * sockConnName = "Client";  
    102.         printf("我们可以聊五句话");  
    103.         int n = 5;  
    104.         while(n--){  
    105.             printf("还剩%d次: ", n+1);  
    106.             char recvBuf[100];  
    107.             recv(sockConn, recvBuf, 100, 0);  
    108.             printf("%s Says: %s ", sockConnName, recvBuf);     // 接收信息  
    109.               
    110.             char talk[100];  
    111.             printf("Please enter what you want to say next("quit"to exit):");  
    112.             gets(talk);  
    113.             send(sockConn, talk, strlen(talk)+1, 0);            // 发送信息  
    114.             printf(" ");  
    115.         }         
    116.         printf(" End talking...  ");  
    117.         closesocket(sockConn);  
    118.     }  
    119.   
    120.     printf(" ");  
    121.     system("pause");  
    122.     return 0;  
    123. }  


     

    1. // client.cpp  
    2.   
    3. #include <iostream>  
    4. #include <cstdio>  
    5. #include <Winsock2.h>  
    6.   
    7. using namespace std;  
    8.   
    9. int main()  
    10. {  
    11. // 加载socket动态链接库(dll)  
    12.     WORD wVersionRequested;  
    13.     WSADATA wsaData;    // 这结构是用于接收Wjndows Socket的结构信息的  
    14.     int err;  
    15.        
    16.     wVersionRequested = MAKEWORD( 1, 1 );   // 请求1.1版本的WinSock库  
    17.        
    18.     err = WSAStartup( wVersionRequested, &wsaData );  
    19.     if ( err != 0 ) {  
    20.         return -1;          // 返回值为零的时候是表示成功申请WSAStartup  
    21.     }  
    22.        
    23.     if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {  
    24.         // 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本  
    25.         // 否则的话,调用WSACleanup()清除信息,结束函数  
    26.         WSACleanup( );  
    27.         return -1;   
    28.     }  
    29.       
    30. // 创建socket操作,建立流式套接字,返回套接字号sockClient  
    31.     // SOCKET socket(int af, int type, int protocol);  
    32.     // 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)  
    33.     // 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)  
    34.     SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);  
    35.   
    36. // 将套接字sockClient与远程主机相连  
    37.     // int connect( SOCKET s,  const struct sockaddr* name,  int namelen);  
    38.     // 第一个参数:需要进行连接操作的套接字  
    39.     // 第二个参数:设定所需要连接的地址信息  
    40.     // 第三个参数:地址的长度  
    41.     SOCKADDR_IN addrSrv;  
    42.     addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");      // 本地回路地址是127.0.0.1;   
    43.     addrSrv.sin_family = AF_INET;  
    44.     addrSrv.sin_port = htons(6000);  
    45.     connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));  
    46.   
    47.     char recvBuf[100];  
    48.     recv(sockClient, recvBuf, 100, 0);  
    49.     printf("%s ", recvBuf);  
    50.   
    51.     send(sockClient, "Attention: A Client has enter... ", strlen("Attention: A Client has enter... ")+1, 0);  
    52.   
    53.     printf("我们可以聊五句话");  
    54.     int n = 5;  
    55.     do{  
    56.         printf(" 还剩%d次:", n);  
    57.         char talk[100];  
    58.         printf(" Please enter what you want to say next("quit"to exit):");  
    59.         gets(talk);  
    60.         send(sockClient, talk, strlen(talk)+1, 0);          // 发送信息  
    61.   
    62.         char recvBuf[100];  
    63.         recv(sockClient, recvBuf, 100, 0);  
    64.         printf("%s Says: %s ""Server", recvBuf);     // 接收信息  
    65.     }while(--n);  
    66.   
    67.     printf("End linking... ");  
    68.     closesocket(sockClient);  
    69.     WSACleanup();   // 终止对套接字库的使用  
    70.   
    71.     printf(" ");  
    72.     system("pause");  
    73.     return 0;  
    74. }  


     

    三。程序设计相关基础知识

    1.计算机网络
    2.IP地址
    3.协议
    4.网络体系结构


    5.TCP/IP体系结构与特点


    6.客户机/服务器模式


    7.TCP/IP特点

    8.套接字的引入


    9.面向 连接/无连接 的套接字的系统调用时序图/流程图

  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/likeFlyingFish/p/5345988.html
Copyright © 2011-2022 走看看