zoukankan      html  css  js  c++  java
  • 20191323王予涵第13章学习笔记

    20191323王予涵第13章学习笔记

    TCP/IP

    知识点总结及归纳

    UDP(尽最大努力传输)

    UDP(用户数据报协议)在IP上运行,用于发送/接收数据报。与IP类似,UDP不能保证可靠性,但是快速高效。它可用于可靠性不重要的情况。用户可以使用ping命令探测目标主机。
    ping是一个向目标主机发送带时间戳UDP包的应用程序。接收到一个pinging数据包后,目标主机将带有时间戳的UDP包回送给发送者,让发送者可以计算和显示往返时间。 如果目标主机不存在或宕机,当TTL减小为0时,路由器将会丢弃pinging UDP数据包。在这种情况下,用户会发现目标主机没有任何响应。用户可以尝试再次ping,或者断定目标主机宕机。在这种情况下,最好使用UDP,因为不要求可靠性。

    TCP(可靠传输)

    TCP(传输控制协议)是一种面向连接的协议,用于发送/接收数据流。TCP也可在IP上运行,但它保证了可靠的数据传输。通常,UDP类似于发送邮件的USPS,而TCP类似于电话连接。

    网络序主机序

    计算机可以使用大端字节序,也可以使用小端字节序。在互联网上,数据始终按网络序排列,这是大端。在小端机器上,例如基于Intel x86的PC, htons()、htonl()、ntohs()、 ntohl()等库函数,可在主机序和网络序之间转换数据。

    套接字编程

    数据结构:

    #include <sys/socket.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    
    struct sockaddr_in {
        sa_family_t sin_family; // AF_INET for TCP/IP
        in_port_t sin_port;// port number
        struct in_addr sin_addr;// IP address
    };// internet address 
    struct in_addr {// internet address 
        uint32_ts_addr;// IP address in network byte order
    };
    
    • TCP/IP 网络的 sin_family 始终设置为 AF_INET;
    • sin_port包含按网络字节顺序排列的端口号;
    • sin addr是按网络字节顺序排列的主机IP地址。

    二、实践基于华为服务器UDP通信

    代码

    “client.c"

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    
    #define BUFLEN 256
    #define SERVER_PORT 8888
    #define SERVER_HOST "121.37.93.202"
    
    char line[BUFLEN];
    struct sockaddr_in server;
    int sock, rlen, slen = sizeof(server);
    
    int main()
    {
        printf("creat a udp socket\n");
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
        printf("fill me with server address and port numbers\n");
        memset((char *)&server, 0, sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(SERVER_PORT);
        //inet_aton(SERVER_HOST, &server.sin_addr);
        server.sin_addr.s_addr = inet_addr(SERVER_HOST);
    
       while(1)
       {
           printf("enter a line:");
           fgets(line, BUFLEN,stdin);
           line[strlen(line)-1] = 0;
           printf("send line to server\n");
           sendto(sock,line, strlen(line),0,(struct sockaddr *)&server,slen);
           memset(line, 0, BUFLEN);
           printf("try to receive\n");
           rlen = recvfrom(sock,line,BUFLEN,0,(struct sockaddr *)&server, &slen);
           printf("rlen=%d: line=%s\n",rlen,line);
       }
    }
    

    "server.c"

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    
    #define BUFLEN 256
    #define PORT 8888
    
    char line[BUFLEN];
    struct sockaddr_in me, client;
    int sock, rlen, clen = sizeof(client);
    
    int main()
    {
        printf("creat a udp socket\n");
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
        printf("fill me with server address and port numbers\n");
        memset((char *)&me, 0, sizeof(me));
        me.sin_family = AF_INET;
        me.sin_port = htons(PORT);
    
        //inet_aton("121.37.93.202", &me.sin_addr);
        me.sin_addr.s_addr = htonl(INADDR_ANY);
    
        printf("bind socket to server IP and port\n");
        bind(sock, (struct sockaddr*)&me, sizeof(me));
    
        printf("wait for data\n");
        while(1)
        {
            memset(line, 0, BUFLEN);
            printf("waiting for data\n");
            rlen = recvfrom(sock, line,BUFLEN,0,(struct sockaddr *)&client, &clen);
            printf("recive from [host:prot]= [%s:%d]\n",inet_ntoa(client.sin_addr), ntohs(client.sin_port));
            printf("rlen=%d: line=%s\n",rlen,line);
            printf("send reply\n");
            sendto(sock, line, rlen, 0, (struct sockaddr*)&client, clen);
    
        }
    }
    

    结果截图:

  • 相关阅读:
    js面对对象和jQuery的使用
    感知器PLA算法
    MSP430G2系列学习笔记
    数学建模——规划问题
    51单片机学习(一)
    打靶法求解两点边值问题
    GAOT工具箱(遗传算法)的应用
    数学建模方法
    关于mysql 5.7 版本登录时出现错误 1045的随笔
    oracle复习(二)
  • 原文地址:https://www.cnblogs.com/WANGYUHAN/p/15616835.html
Copyright © 2011-2022 走看看