赞
踩
从上到下
应用层->tcp->ip->链路层
应用层->udp->ip->链路层
数据链路层通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路,为IP 层提供数据传送服务。(链路层是网络通信的物理基础)
网络层通过路由选择算法,为分组选择最适当的路径,实现两个端系统之间的数据透明传送。
ARPANET 的研制经验表明,对于复杂的计算机网络协议,其结构应该是层次式的。
分层的好处:隔层之间是独立的,灵活性好,结构上可以分隔开,易于实现和维护,能促进标准化工作。
调用listen函数时创建了连接请求等待队列。它是存储客户端连接请求信息的空间。accept函数调用后,将从连接请求队列中取出连接请求信息,并与相应客户端建立连接。
客户端是请求连接的程序,不是一个接收连接的程序。所以,服务器的地址信息是更重要的因素,没有必要通过bind函数明确地分配地址信息。但是,要想和服务器通信,必须将自己的地址信息分配到套接字上,因此,在connect函数调用时,自动把IP地址和端口号输入到套接字上。
7.
网上很多,就不一一赘述了
seq用于给数据字节编号,ack用于确认收到编号的信息。每次传输信息时同时发送seq(表示发送数据最后一个字节的编号),收到数据的主机以seq为基础回复发送数据的主机ack(表示已收到数据的最后一个字节的编号+1)。通过这种机制,传输数据的主机就知道数据是否被正确接收。在不正确传输时,可以重传数据。
TCP调用write时数据就向端口的输出缓冲区移动。然后经过网络传输传输到对方主机套接字的输入缓冲。这样,输入缓冲中存储的数据通过read函数的响应来读取。
TCP通过滑动窗口协议,保证有剩余缓冲空间时继续接受数据
5.TCP_SERVER.C
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- void error_handing( char * message);
- int main(int argc,char * argv[]){
- int serv_sock,clnt_sock;
- int str_len,i;
- struct sockaddr_in servaddr;
- struct sockaddr_in clntaddr;
- socklen_t clnt_addr_size;
- char read_buf[100];
- char meg1[]="hello client";
- char meg2[]="i'm server";
- char meg3[]="nice to meet you";
- char * str_arr[]={meg1,meg2,meg3};
- if(argc!=2){
- printf("Usage: %s <port> \n",argv[0]);
- exit(1);
- }
- serv_sock=socket(PF_INET,SOCK_STREAM,0);
- if(serv_sock==-1)
- error_handing("socket() error");
- memset(&servaddr,0,sizeof(servaddr));
- servaddr.sin_family=AF_INET;
- servaddr.sin_port= htons(atoi(argv[1]));
- servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
- if(bind(serv_sock,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
- error_handing("bind() error");
- if(listen(serv_sock,5)==-1)
- error_handing("listen() error");
- clnt_addr_size=sizeof(clntaddr);
- clnt_sock=accept(serv_sock,(struct sockaddr*)&clntaddr,&clnt_addr_size);
- if(clnt_sock==-1)
- error_handing("accept() error");
- for(i=0;i<3;i++){
- str_len=strlen(str_arr[i])+1;
- // write(clnt_sock,(char *)(&str_len),4);
- write(clnt_sock,str_arr[i],str_len);
-
- // read(clnt_sock,(char *)(&str_len),4);
- read(clnt_sock,read_buf,str_len);
- puts(read_buf);
-
- }
- close(clnt_sock);
- close(serv_sock);
- return 0;
- }
- void error_handing(char * message){
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(1);
- }
TCP_CLIENT.C
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- void error_handing( char * message);
- int main(int argc, char * argv[]){
- int sock;
- char read_buf[100];
- struct sockaddr_in serv_addr;
- int str_len,i;
- char meg1[]="hello server";
- char meg2[]="i'm client";
- char meg3[]="nice to meet you";
- char * str_arr[]={meg1,meg2,meg3};
- if(argc!=3){
- printf("Usage: %s <IP> <port> \n",argv[0]);
- exit(1);
- }
- sock=socket(PF_INET,SOCK_STREAM,0);
- if(sock==-1){
- error_handing("socker() error");
- }
- memset(&serv_addr,0,sizeof(serv_addr));
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port= htons(atoi(argv[2]));
- serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
- if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)
- error_handing("connect() error");
- for(i=0;i<3;i++){
- // read(sock,(char *)&str_len,4);
- read(sock,read_buf,str_len);
- puts(read_buf);
-
- str_len=strlen(str_arr[i])+1;
- //write(sock,(char *)&str_len,4);
- write(sock,str_arr[i],str_len);
- }
- close(sock);
- return 0;
-
- }
- void error_handing( char * message){
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(1);
- }
6.收发文件的服务端实现
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #define BUFSIZE 30
- void error_handing(char * message);
- int main(int argc,char *argv[]){
- int serv_sock,clnt_sock;
- socklen_t clnt_addr_sz;
- FILE * fp;
- int read_cnt;
- char buf[BUFSIZE];
- struct sockaddr_in serv_addr,clnt_addr;
- if(argc!=2){
- printf("Usage %s <port>",argv[0]);
- exit(1);
- }
- fp=fopen("file_server.cc","rb");
- serv_sock=socket(PF_INET,SOCK_STREAM,0);
- if(serv_sock==-1){
- error_handing("socker() error");
- }
- memset(&serv_addr,0,sizeof(serv_addr));
- serv_addr.sin_port=htons(atoi(argv[1]));
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
- if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1){
- error_handing("bind() error");
- }
- listen(serv_sock,5);
- clnt_addr_sz=sizeof(clnt_addr);
- clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz);
- if(clnt_sock==-1){
- error_handing("accept() error");
- }
- while(1){
- read_cnt=fread((void *)buf,1,BUFSIZE,fp);
- if(read_cnt<BUFSIZE)
- {
- write(clnt_sock,buf,read_cnt);
- break;
- }
- write(clnt_sock,buf,BUFSIZE);
- }
- shutdown(clnt_sock,SHUT_WR);
- read(clnt_sock,buf,BUFSIZE);
- printf("message from server: %s \n",buf);
- fclose(fp);
- close(clnt_sock);
- close(serv_sock);
- return 0;
- }
- void error_handing(char * message){
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(1);
- }
FILE_CLIENT.C
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #define BUFSIZE 30
- void error_handing(char * message);
- int main(int argc,char *argv[]){
- int serv_sock;
- FILE * fp;
- char buf[BUFSIZE];
- int read_cnt;
- struct sockaddr_in serv_addr;
- if(argc!=3){
- printf("Usage %s <ip> <port> ",argv[0]);
- exit(1);
- }
- fp=fopen("receive.dat","wb");
- serv_sock=socket(PF_INET,SOCK_STREAM,0);
- if(serv_sock==-1){
- error_handing("socket() error");
- }
- memset(&serv_addr,0,sizeof(serv_addr));
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port=htons(atoi(argv[2]));
- serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
- connect(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
- while(read_cnt=read(serv_sock,buf,BUFSIZE)!=0){
- fwrite((void *)buf,1,read_cnt,fp);
- }
- puts("Received file data");
- sprintf(buf,"that's all");
- write(serv_sock,buf,10);
- fclose(fp);
- close(serv_sock);
- return 0;
-
- }
- void error_handing(char * message){
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(1);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。