江苏大学嵌入式课程设计报告_第1页
江苏大学嵌入式课程设计报告_第2页
江苏大学嵌入式课程设计报告_第3页
江苏大学嵌入式课程设计报告_第4页
江苏大学嵌入式课程设计报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统课程设计报告学院名称:电气学院专业班级:电科1102学生姓名:胡志文学号:3110504039Linux下的SOCKET通信实验摘要:(1)掌握LinuxSOCEKT编程的常用函数:---编写服务器程序server---编写客户端程序client---编写聊天程序的服务器程序listener---编写聊天程序的客户端程序talker(2)下载调试上述程序一.1.socket概念:所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。2.socket基本应用:Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读、写操作。套接字是网络的基本构件。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。套接字存在通信区域(通信区域又称地址簇)中。套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS中的套接字只支持一个域——网际域。套接字具有类型。我们将Socket翻译为套接字.3.socket发展现状:七十年代中,美国国防部高研署(DARPA)将TCP/IP的软件提供给加利福尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。这个API称为Socket接口。今天,SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。二.1.程序原理:2.程序流程图:客户端流程图:服务端流程图:开始填充sockaddr_in结构体开始填充sockaddr_in结构体监听是否有客户端请求连接创建子进程,发送数据,父进程继续监听创建套接字绑定套接字与客户端连接关闭套接字结束NY开始填充sockaddr_in结构体与服务端连接接收”Helloworld!\n”字符串输出字符串创建套接字关闭套接字结束3、程序代码及相关代码注释:(1)客户端程序:下面是一个简单的TCP客户端程序client.c,在这个程序中你必须提供一个命令行参数:服务端所在机器主机名。当然,服务端还必须在客户端运行以前就已经正常运行。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<errno.h>#include<string.h>#include<netdb.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#definePORT3490//连接时使用的端口号#defineMAXDATASIZE100//一次所能接收的最长字符数intmain(intargc,char*argv[]){intsockfd,numbytes;charbuf[MAXDATASIZE];structhostent*he;structsockaddr_intheir_addr;//客户端信息if(argc!=2){fprintf(stderr,"usage:clienthostname\n");exit(1);}if((he=gethostbyname(argv[1]))==NULL){//域名解析perror("gethostbyname");exit(1);}if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ //创建套接字,返回文件描述符perror("socket");exit(1);}their_addr.sin_family=AF_INET;//采用ipv4their_addr.sin_port=htons(PORT);//将主机号转换成网络号their_addr.sin_addr=*((structin_addr*)he->h_addr);memset(&(their_addr.sin_zero),'\0',8);//制作成字符串if(connect(sockfd,(structsockaddr*)&their_addr,sizeof(structsockaddr))==-1){ //请求连接perror("connect");exit(1);}if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0))==-1){ //接收数据perror("recv");exit(1);}buf[numbytes]='\0';printf("Received:%s",buf);close(sockfd);//关闭套接字return0;}(2)服务端程序:TCP服务器端通过如下步骤建立:a)通过函数socket()建立一个套接口。b)通过函数bind()绑定一个地址(IP地址和端口地址)。这一步确定了服务器的位置,使客户端知道如何访问。c)通过函数listen()监听(listen)端口的新的连接请求。d)通过函数accept()接受新的连接。下面是一个简单的TCP服务器程序server.c,该程序对于每一个连接的客户端直接发送Hello,world!\n”字符串:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/wait.h>#include<signal.h>#defineMYPORT3490 //设置端口号#defineBACKLOG10//可以同时连接的最大客户端数voidsigchld_handler(ints){while(wait(NULL)>0);} //信号处理函数,防止出现僵尸进程intmain(void){intsockfd,new_fd; //sockfd是监听描述符,new_fd是连接描述符structsockaddr_inmy_addr; //服务端信息structsockaddr_intheir_addr; //客户端信息intsin_size;structsigactionsa;intyes=1;if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ //创建服务端文件描述符perror("socket");exit(1);}if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1){ //perror("setsockopt");exit(1);}my_addr.sin_family=AF_INET;//ipv4my_addr.sin_port=htons(MYPORT);//将主机号转换成网络号my_addr.sin_addr.s_addr=INADDR_ANY;//可以和任何主机通信memset(&(my_addr.sin_zero),'\0',8);if(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1){ //绑定套接字perror("bind");exit(1);}if(listen(sockfd,BACKLOG)==-1){//监听是否有客户端请求连接perror("listen");exit(1);}sa.sa_handler=sigchld_handler; //设置接收到信号时所调用的函数sigemptyset(&sa.sa_mask); //设置处理该信号时暂时将指定信号搁置sa.sa_flags=SA_RESTART; //设置信号处理的相关操作if(sigaction(SIGCHLD,&sa,NULL)==-1){ //判断是否有子进程退出perror("sigaction");exit(1);}while(1){sin_size=sizeof(structsockaddr_in);if((new_fd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size))==-1){//处理客户端的连接请求perror("accept");continue;}printf("server:gotconnectionfrom%s\n",inet_ntoa(their_addr.sin_addr));//打印出连接的客户端IP地址if(!fork()){ //创建的子进程,用来发送Hello,world!close(sockfd); //子进程不需要监听if(send(new_fd,"Hello,world!\n",14,0)==-1){//发送信息perror("send");close(new_fd); //关闭发送信息的描述符exit(0);}close(new_fd); //父进程不需要发送信息}return

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论