编写一个使用UDP的服务端和用户端程序_第1页
编写一个使用UDP的服务端和用户端程序_第2页
编写一个使用UDP的服务端和用户端程序_第3页
编写一个使用UDP的服务端和用户端程序_第4页
编写一个使用UDP的服务端和用户端程序_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

北方民族大学课程设计报告系(部、中心)计算机科学与工程学院课程名称计算机操作系统设计题目名称基于SOCKETUDP套接字的信息通信程序成绩指导教师签名北方民族大学教务处制TOC\o"1-5"\h\z1、课程设计说明21.1LINUX下基于的UDP的简单字符通信程序21.2课程设计要求2\o"CurrentDocument"1.3系统原理介绍2\o"CurrentDocument"2、课程设计过程32.1系统调用32.2流程图3、运行后44、结束语5\o"CurrentDocument"5、原程序代码5\o"CurrentDocument"参考资料121、课程设计说明1.1LINUX下基于的UDP的简单字符通信程序基于该连接的字符通信程序需要具备服务器端(Server),客户端(Client)。1.2课程设计要求这次课程设计完一个简单的通信程序,程序分为服务端和客户端,通过调用系统的SOCKET套接字实现两台主机的通信。通过创建一个接收的字线程,实现两个功能的并发执行,所以程序可以随时接收和发送字符信息。1.3系统原理介绍由于在默认情况下WinSock接口的recvfrom()和sendto()都会在被调用时阻塞当前线程,也就是说如果程序正在接受其他用户发来的数据,那么它就不能够执行发送数据的任务,反之相同。也就是说,在程序中创建两个线程,一个线程负责发送消息,另一个消息负责接受消息。两个线程交替运行,从而达到同时收发消息的目的。当然采用多线程方式解决消息收发同步问题可以移除上个程序中每个用户一次只能发送一条消息的限制。sendto()和recvfrom()用于在无连接的数据报socket方式下进行数据传输。由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址。2、课程设计过程2.1系统调用Socket用于创建套接字函数原型为:SOCKETPASCALFARsocket(intaf,inttype,intprtocol);参数af指定通信发生的区域,一般为AF_INET。参数type描述要建立的套接字类型,也就是指流式套接字还是数据报套接字。参数protocl说明该套接字使用的特定类型。sendto()函数原型为:intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof(structsockaddr)。Sendto函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。Recvfrom()函数原型为:intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);from是一个structsockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof(structsockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno。如果你对数据报socket调用了connect()函数时,你也可以利用send()和recv()进行数据传输,但该socket仍然是数据报socket,并且利用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:close(sockfd);bind()函数原型为:intbind(SOCKETs,conststroutsockaddrFAR*name,intnamelen);参数s是由socket()函数调用返回的并且未作连接的套接句柄。参数name是赋给套接字s的本地地址,其长度是可变的。参数namelen指参数name的长度。

connect()函数用于建立套接字的连接函数原型为:intconnect(SOCKETs,conststructscokaddrFAR*name,intnamelen);参数s是要建立连接的本地套接字的句柄。参数name指对方套接字地址结构的指针,对方套接字的地址长度由参数namelen说明。accept()函数原型为:Socketaccept(SOCKETs,structsockaddraddr,intaddrlen);参数s为本地套接字的句柄。参数addr是指客户方套接字地址结构的指针,用来接收实体的地址,addr的确切格式由套接字创建时建立的地址簇决定。参数addrlen为客户方套接字地址的长度。2.2流程图文件(£)偏辑CD查看任)终辙D待剑帮助(H)[TtJiu^lucaIhfls1ftJig]3i./subweicom127.0.0J-dmifang:-ditifang:你好!你好DWE:尚甲也.:查看①终情⑴覆到国指助曲[feng^loca[hastfejigjSL/sev127.0.0.Ihaverujinected你好duEf卯g:你好4、总结与体会通过这次的设计自己了解到在LINUX上进行的网络通信SOCKET原理,和线程的创建和使用方法加深了自己对LINUX操作系统的理解。5、原程序代码客户端#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<pthread.h>#include<stdio.h>#include<errno.h>#include<unistd.h>#defineMAX100voidrecvf(void*sock){intn;int*socked=(int*)sock;charmes[MAX];charbuffer[100];while(1){bzero(buffer,100);bzero(mes,100);n=recvfrom(*socked,mes,MAX,0,NULL,NULL);if(n==-1){printf("recvfailed");}sprintf(buffer,"%s%s”,"duifang:",mes);printf("%s\n”,buffer);}}intmain(void){pthread_tid;charbuffer[MAX];bzero(buffer,MAX);charhow[]="successedinsendingdatafromsbufunction!\n";intn,numto,addrlen;structsockaddr_inaddr;intsockfd,port,num,rnum;charrebuffer[MAX];port=5000;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"socketerror:%s\n”,strerror(errno));}bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(port);if(inet_aton(〃127.0.0.1〃,&addr.sin_addr)<0){fprintf(stderr,"iperror:%s\n”,strerror(errno));}numto=sendto(sockfd,how,strlen(how),0,(structsockaddr*)&addr,sizeof(structsockaddr));if(numto==-1){printf("sendfailed.\n〃);}bzero(buffer,MAX);n=recvfrom(sockfd,buffer,MAX,0,NULL,NULL);if(n<0){printf("rescvfailed\n");}printf("%s\n",buffer);pthread_create(&id,NULL,(void*)recvf,(void*)&sockfd);while(1){bzero(how,MAX);fgets(how,MAX,stdin);numto=sendto(sockfd,how,strlen(how),0,(structsockaddr*)&addr,sizeof(structsockaddr));if(numto==-1){printf("sendfailed.\n");{}close(sockfd);}服务端#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<stdio.h>#include<errno.h>#include<pthread.h>#include<curses.h>#defineSERVER_PORT5000#defineMAX100voidrecvf(void*sock){intn;int*socked=(int*)sock;charmes[MAX];charbuffer[100];while(1){bzero(buffer,100);bzero(mes,100);n=recvfrom(*socked,mes,MAX,0,NULL,NULL);if(n==-1){printf("recvfailed");}sprintf(buffer,"%s%s”,"duifang:",mes);printf("%s”,buffer);}}intmain(void){intaddrlen,n;charmsg[MAX];intsen;bzero(msg,MAX);charsentstr[MAX];bzero(sentstr,MAX);intsockfd;structsockaddr_inaddr;pthread_trecvs;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"SocketError:%s\n”,strerror(errno));}bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(SERVER_PORT);addr.sin_addr.s_addr=INADDR_ANY;if(bind(sockfd,(structsockaddr*)&addr,sizeof(structsockaddr))<0){fprintf(stderr,"BindError:%s\n”,strerror(errno));}n=recvfrom(sockfd,msg,MAX,0,(structsockaddr*)&addr,&addrlen);if(n==-1){printf("recverror1");}fprintf(stdout,"%shaveconnected”,inet_ntoa(addr.sin_addr));sprintf(sentstr,"welcom%s”,inet_ntoa(addr.sin_addr));n=pthread_create(&recvs,NULL,(void*)recvf,(void*)&sockfd);sen=sendto(sockfd,sentstr,MAX,0,(structsockaddr*)&addr,addrlen);i

温馨提示

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

评论

0/150

提交评论