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);

    }
}

结果截图:

posted @ 2021-11-28 21:58  WangYuHan20191323  阅读(43)  评论(0编辑  收藏  举报