zoukankan      html  css  js  c++  java
  • 5.10TCP客户端服务器

    1. 实验4-4:TCP客户端服务器

    • 实验目的:

    熟悉TCP客户端服务器编程

    • 实验要求:

    1、实现TCP客户端服务器回显程序

    2、传输信息要求如下

    (1)尝试用C语言结构去发送或接收一个信息包

    (2)将服务器运行于开发板,客服端运行于ubuntu 12.04,抓包分析TCP协议

    • 实验步骤:

    1、服务器端

    #include <stdlib.h> 

    #include <stdio.h> 

    #include <errno.h> 

    #include <string.h> 

    #include <netdb.h> 

    #include <sys/types.h> 

    #include <netinet/in.h> 

    #include <sys/socket.h> 

    #define portnumber 3333//服务器的端口号和客户端的端口号一定相等

    int main(int argc, char *argv[]) 

    int sockfd,new_fd; 

    struct sockaddr_in server_addr; 

    struct sockaddr_in client_addr; 

    int sin_size; 

    int nbytes;

    char buffer[1024];

    /* 服务器端开始建立sockfd描述符 */ 

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP

    fprintf(stderr,"Socket error:%s a",strerror(errno)); 

    exit(1); 

    /* 服务器端填充 sockaddr结构 */ 

    bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0

    server_addr.sin_family=AF_INET;                 // Internet

    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  // (将本机器上的long数据转化为网络上的long数据)和任何主机通信  //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP

    server_addr.sin_port=htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

    /* 捆绑sockfd描述符到IP地址 */ 

    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 

    fprintf(stderr,"Bind error:%s a",strerror(errno)); 

    exit(1); 

    /* 设置允许连接的最大客户端数 */ 

    if(listen(sockfd,5)==-1) 

    fprintf(stderr,"Listen error:%s a",strerror(errno)); 

    exit(1); 

    while(1) 

    /* 服务器阻塞,直到客户程序建立连接 */ 

    sin_size=sizeof(struct sockaddr_in); 

    if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) 

    fprintf(stderr,"Accept error:%s a",strerror(errno)); 

    exit(1); 

    fprintf(stderr,"Server get connection from %s ",inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串

    if((nbytes=read(new_fd,buffer,1024))==-1) //此处可以写为if((nbytes=recv(new_fd,buffer,1024,0))==-1) 

    fprintf(stderr,"Read Error:%s ",strerror(errno)); 

    exit(1); 

    }

    buffer[nbytes]='';

    printf("Server received %s ",buffer);

    /* 这个通讯已经结束 */ 

    close(new_fd); 

    /* 循环下一个 */ 

    /* 结束通讯 */ 

    close(sockfd); 

    exit(0); 

        2、在客户端传送学生信息,并接收回显结果

    #include <stdlib.h> 

    #include <stdio.h> 

    #include <errno.h> 

    #include <string.h> 

    #include <netdb.h> 

    #include <sys/types.h> 

    #include <netinet/in.h> 

    #include <sys/socket.h> 

    #define portnumber 3333

    int main(int argc, char *argv[]) 

    int sockfd; 

    char buffer[1024]; 

    struct sockaddr_in server_addr; 

    struct hostent *host; 

            /* 使用hostname查询host 名字 */

    if(argc!=2) 

    fprintf(stderr,"Usage:%s hostname a ",argv[0]); 

    exit(1); 

    if((host=gethostbyname(argv[1]))==NULL) 

    fprintf(stderr,"Gethostname error "); 

    exit(1); 

    /* 客户程序开始建立 sockfd描述符 */ 

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP

    fprintf(stderr,"Socket Error:%sa ",strerror(errno)); 

    exit(1); 

    /* 客户程序填充服务端的资料 */ 

    bzero(&server_addr,sizeof(server_addr)); // 初始化,置0

    server_addr.sin_family=AF_INET;          // IPV4

    server_addr.sin_port=htons(portnumber);  // (将本机器上的short数据转化为网络上的short数据)端口号

    server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址

    /* 客户程序发起连接请求 */ 

    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 

    fprintf(stderr,"Connect Error:%sa ",strerror(errno)); 

    exit(1); 

    /* 连接成功了 */ 

    printf("Please input char: ");

    /* 发送数据 */

    fgets(buffer,1024,stdin); 

    write(sockfd,buffer,strlen(buffer)); //此处可以写为send(sockfd,buffer,strlen(buffer),0); 

    /* 结束通讯 */ 

    close(sockfd); 

    exit(0); 

     

     

     

    3、在服务器接收信息,显示并回显

        4、交叉编译服务器,并通过NFS共享拷贝到开发板运行

     

    5、编译客服端,直接在ubuntu 12.04上运行

    6、测试客户端与服务器能正常通过TCP传输学生信息

    服务端和客户端的ip:

    实验心得:

        是一TCP种基于连接的通信方式,该实验里,实现了一个服务器端:开发板,和一个客户端pc主机。两者进行信息的交流。上面是我的实现的截图。整个过程很是顺利。谢谢。

  • 相关阅读:
    数据源ObjectDataSource的数据访问类的编写
    ASP.NET网页文本编辑器的使用
    装饰模式
    策略模式
    代理模式
    备份、还原数据库
    简单工厂和工厂模式
    ASP.NET上传多个文件
    数据库访问类的编写
    UVA 11069 A Graph Problem
  • 原文地址:https://www.cnblogs.com/FORFISH/p/4201836.html
Copyright © 2011-2022 走看看