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