项目日报开发表 | |
项目名称 | 苏嵌实训—嵌入式LinuxC第十天 |
今日进度以及任务 | Linux网络结构等知识 |
本日任务完成情况 | 应用层(application layer) 应用层是体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程就是主机中正在运行的程序。对于不听的网络应用需要不有不同的应用层协议。在互联网的应用层协议很多,如域名DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,等等。我们把应用层的数据单元称为报文(messgae)。 运输层的任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务穿上那个应用层报文。所谓通用的,是指并不针对某个特定网路应用,而是多种应用可以使用同一个运输层服务。由于一台主机可以同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付给上面应用层的相关进程。 运输层主要有下面两种协议: 传输控制协议TCP(Transmission Control Protocol)-提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。 用户数据报协议 UDP(User Datagram)。 Protocol)-提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。 顺便指出,有人原意把运输层称为传输层,理由是这一层使用的TCP协议就叫做传输控制协议。从意思上看,传输和运输差别也不大,但OSI定义的第四层使用的是Transport,而不是Transmission。这两个字的含义还是有些差别。因此,使用运输层这个译名比较准确。 网络层负责为分组交换网上的不同主机提供通信服务。 互联网是有大量的异构(heterogeneous)网络来通过路由器(Router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议IP(Internet Protocol)和许多路由选择协议, 因此互联网的网络层也叫作网际层或IP层。 数据链路层通常简称为链路层。我们知道,两台主机之间的数据传输,总是在一段一段的链路上传送的, 这就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,数据链路层量网络层交下来的IP数据报封装成帧(frameing),在两个相邻节点间的链路上传送帧, 每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错信息等)。 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束,这样数据链路层在收到一个帧后,就可从中提取数据部分,上交到网络层。 控制信息还能使接收端能够检测到所收到的帧中有无差错。如发现有差错,数据链路层就简单的丢弃了这个出了差错的帧,以免继续在网络传输下去白白的浪费资源。如果需要改正数据在数据链路层传输时出现的差错(这就是说,数据链路层不仅要检错,还要纠错), 那么就可以采用可靠数据传输协议来纠正出现的差错。这种方法会使数据链路层的协议复杂些。 在物理层上所传数据的单位是比特(bit)。发送方发送1或者0时,接收方应该接收相同的1或者0,因此物理层要考虑用多大的电压代表"1"或者"0", 以及接收方如何识别发送方所发出的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各引脚如何连接。当然解释比特代表的意思,就不是物理层的任务。请注意,传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不是物理层协议之内而是在物理层协议的下面。因此也有人把物理层当做第0层。 在互联网所使用的的各种协议中,最重要的和最著名的就是TCP和IP两个协议。现在人们经常提到的TCP/IP并不一定是单指TCP和IP两个具体的协议,而往往是表示互联网所使用的的整个TCP/IP协议族(Protocol suite) |
本日开发中出现的问题汇总 | ip地址连接失败 |
本日未解决问题 | socket 编程完成服务器和客户端之间的通信 |
本日开发收获 | |
其他 |
作业
server.c
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 33333
int main()
{
int servfd;
int cliefd;
int opt;
int cl_len;
char buff[1024];
struct sockaddr_in servaddr;
struct sockaddr_in clieaddr;
servfd = socket(AF_INET, SOCK_STREAM, 0);
if(servfd == -1)
{
perror("socket error:");
exit(1);
}
printf("socket success!\n");
bzero(&servaddr, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
opt = 1;
setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(bind(servfd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) < 0)
{
perror("bind error:");
exit(1);
}
printf("bind success!\n");
if(listen(servfd, 3) < 0)
{
perror("listen error:");
exit(1);
}
printf("listen success!\n");
while(1){
memset(buff, 0, sizeof(buff));
bzero(&clieaddr, sizeof(struct sockaddr_in));
cl_len = sizeof(struct sockaddr_in);
printf("accepting ........ \n");
cliefd = accept(servfd, (struct sockaddr *)(&clieaddr), &cl_len);
if(cliefd == -1)
{
perror("accept error:");
exit(1);
}
printf("ip: %s port: %d\n", inet_ntoa(clieaddr.sin_addr), ntohs(clieaddr.sin_port));
read(cliefd, buff, sizeof(buff));
printf("recv = %s\n", buff);
usleep(2);
write(cliefd, buff, strlen(buff));
}
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 33333
int main()
{
int cliefd;
char buff[1024];
struct sockaddr_in servaddr;
cliefd = socket(AF_INET, SOCK_STREAM, 0);
if(cliefd == -1)
{
perror("socket error:");
exit(1);
}
printf("socket success!\n");
bzero(&servaddr, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(cliefd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) < 0)
{
perror("connection error:");
exit(1);
}
printf("connect success!\n");
write(cliefd, "hello world!", 13);
memset(buff, 0, sizeof(buff));
read(cliefd, buff, sizeof(buff));
printf("recv = %s\n", buff);
return 0;
}
运行结果:
[vic@localhost note]$ ./server
socket success!
bind success!
listen success!
accepting ........
ip: 127.0.0.1 port: 46084
recv = hello world!
accepting ........
ip: 127.0.0.1 port: 46086
recv = hello world!
accepting ........
ip: 127.0.0.1 port: 46088
recv = hello world!
accepting ........
ip: 127.0.0.1 port: 46090
recv = hello world!
accepting ........
[vic@localhost note]$ ./client
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client
socket success!
connect success!
recv = hello world!