实验四 客户服务器通信

合集下载

实验四、计算机网络实验指导书-tcp协议分析及应用层命令

实验四、计算机网络实验指导书-tcp协议分析及应用层命令

计算机网络实验指导书-TCP协议分析及应用层命令实验指导教师:韩家伟孙玉钰实验4TCP报文段分析及应用层命令实验1.实验目的1.掌握使用IRIS工具对TCP与UDP协议进行抓包分析的方法。

2.掌握TCP协议的报文格式及其优缺点。

3.熟悉应用层命令。

2.实验设备与环境1.Iris网络分析软件2.网络数据包捕获3.捕获TCP报文段并分析(一)实验内容1.启动网络嗅探工具,设置好过滤条件,捕获UDP用户数据报和TCP报文段。

2.分析UDP与TCP协议。

(二)TCP协议实验指导传输控制协议(Transmission Control Protocol,TCP)是一种可靠的面向连接的传送协议。

它在传送数据时是分段进行的,主机之间交换数据必须建立一个会话。

它用比特流通信,即数据被作为无结构的字节流。

通过每个TCP传输的字段指定顺序号,以获得可靠性。

它是在OSI参考模型的第4层,TCP是使用IP的网际间互联功能而提供可靠的数据传输,IP不停地把报文放到网络上,而TCP负责确信报文到达。

在协同IP的操作中TCP负责握手过程、报文管理、流量控制、错误检测和处理(控制),并根据一定的编号顺序对非正常顺序的报文给予重新排列顺序。

TCP是面向连接的协议。

在面向连接的环境中,开始传输数据之前,在两个终端之间必须先建立一个连接。

对于一个要建立的连接,通信双方必须用彼此的初始化序列号seq和来自对方成功传输确认的应答号ack(指明希望收到的下一个八位组的编号)来同步,习惯上将同步信号写为SYN,应答信号写为ACK。

整个同步的过程称为三次握手,如图4-1所示。

图4-1 TCP连接的建立对于一个已经建立的连接,TCP使用四次握手来结束通话(使用一个带有FIN附加标记的报文段)。

如图4-2所示。

图4-2 TCP连接的释放TCP每发送一个报文段,就对这个报文段设置一次计时器。

只要计时器设置的重传时间到期,但还没有收到确认,就要重传这一报文段。

计算机网络课程原始套接字编程实验的实践探索

计算机网络课程原始套接字编程实验的实践探索

计算机网络课程原始套接字编程实验的实践探索摘要:简述计算机网络课程及实验体系的发展状况,指出原有实验模式的不足,改革实验体系并新增了部分原始套接字实验模块,以网络嗅探程序设计为例给出原始套接字程序设计实验的目的、要求和实现方法,分析总结了原始套接字实验的特色和优势。

关键词:网络实验;原始套接字;协议分析;综合设计作为计算机科学与技术、软件工程、网络工程等专业重要的学位课和考研课,计算机网络课程在我校开设已整整20年,先后历经多次课程和实验体系改革,在IT人才培养和专业建设方面发挥着重要作用。

1990年,计算机网络课程在我校计算机应用87级本科班正式开设;1996年,计算机网络课程从OSI开放式系统互连模型转向到TCP/IP协议体系;2001年,计算机网络课程实施双语教学并成为我校首批双语示范课程;2003年,Cisco网络技术引入网络课程教学;2004年,计算机网络课程被评为校优质课和首批校级精品课。

2004年以后,计算机网络实验课程主要采用Java套接字编程和思科网络配置管理相结合,在学生动手能力培养方面取得了积极效果。

然而,Java套接字技术只能进行应用层编程,路由配置管理则只关注网络互连设备的操作管理,这对于理解底层网络协议是不够的。

在此背景下,课程组对网络实验课程进行了改革,在原有实验环节中增加了原始套接字实验,将操作、验证、分析和设计结合起来,在提高动手能力的同时,加深了学生对于网络协议的理解和运用。

1计算机网络课程实验体系目前,我院网络课程体系包括了计算机网络原理、TCP/IP协议分析、网络安全、路由与交换、无线网络技术、网络编程以及网络管理等7门专业课程。

其中,计算机网络原理为必修课和研究生入学统考课,面向计算机科学与技术、通信工程、软件工程等专业开设,而不同专业的后续网络课程安排有所差异。

从有利于学生综合素质和创新能力的培养角度出发,课程组对计算机网络原理实验课程进行了调整,增加了两个原始套接字编程设计实验,将网络编程深入到底层协议,旨在强化学生深入理解网络协议和报文格式。

TCP和UDP客户端及服务器端实验报告

TCP和UDP客户端及服务器端实验报告

TCP和UDP客户端及服务器端实验报告一、原理1.基于TCP协议的服务器端程序流程:1)创建套接字(socket)2)绑定套接字(bind)3)将套接字设为监听,准备接收客户请求(listen)4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)5)用返回的套接字与客户端进行通信(send/recv)6)返回,等待另一客户请求7)关闭套接字2.基于TCP协议的客户端程序流程1)创建套接字(socket)2)向服务器发出连接请求(connect)3)和服务器端进行通信(send/recv)4)关闭套接字在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。

3.基于UDP的服务器端编写1)创建套接字(socket)2)绑定(bind)3)等待接收数据(recvfrom)4)关闭套接字4.基于UDP的客户端编写1)创建套接字(socket)2)向服务器发送数据(sendto)3)关闭套接字在所有的套接字编程中第一步都是加载套接字库(WSAStartup)对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。

TCP代码实现:首先要建两个工程,不妨设为tcpsrv和tcpclient,分别为客户端和服务器端tcpsrv.cpp//TCP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(){SOCKET serversoc;SOCKET clientsoc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((serversoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if(bind(serversoc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Bind fail!\n");return -1;}//start listen, maximum length of the queue of pending connections is 1printf("Start listen...\n");if(listen(serversoc, 1) != 0){printf("Listen fail!\n");return -1;}len = sizeof(SOCKADDR_IN);//waiting for connectingif((clientsoc = accept(serversoc, (SOCKADDR *)&clientaddr, &len))<=0) {printf("Accept fail!\n");return -1;}printf("Connected\n");while(1){//waiting for data receiveif(recv(clientsoc, buf, BUFLEN, 0) <= 0){//some error occurprintf("Close connection\n");closesocket(clientsoc);break;}printf("%s\n",buf);}WSACleanup(); //clean up Ws2_32.dllreturn 0;}相应的客户端程序,tcpclient.cpp//TCP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(){SOCKET soc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;unsigned char buf[1024];WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//connect to serverprintf("Try to connect...\n");if(connect(soc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Connect fail!\n");return -1;}printf("Connected\n");while(1){scanf("%s", buf);//send to serverif(send(soc, buf, strlen(buf)+1, 0)<=0){printf("Error!\n");}}WSACleanup(); //clean up Ws2_32.dllreturn 0;}UDP服务器端://UDP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a process memset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_port = htons(9102);addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(soc,(struct sockaddr *)&addr,sizeof(struct sockaddr))!=0){printf("Bind fail!\n");return -1;}len = sizeof(addr);printf("start listen...\n");while(1) {recvfrom(soc, buf, BUFLEN, 0,(struct sockaddr*)&addr, &len);printf("%s\n",buf);}WSACleanup(); //关闭return 0;}客户端://UDP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;unsigned char buf[BUFLEN];WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);//initial Ws2_32.dll by a processmemset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(9102);bind(soc,(struct sockaddr *)&addr,sizeof(addr));while(1) {scanf("%s", buf);sendto(soc, buf, strlen(buf)+1, 0, (struct sockaddr *)&addr, sizeof(addr));}WSACleanup();//clean up Ws2_32.dllreturn 0;}。

TCPUDP客户服务器实验报告

TCPUDP客户服务器实验报告

《计算机网络》课程综合实验报告之TCP/UDP服务器端和客户端程序设计院系:信息工程学院专业:电子信息工程姓名:荆林风学号:20142410232一、实验目的学习和掌握Linux环境下的TCP和UDP通信服务器和客户端的基本编程方法和运行机制,掌握TCP/UDP报文段的通信过程。

二、实验平台win10操作系统下VMware Workstation工作环境下linux虚拟机,ubuntu操作系统三、实验内容1..编写Linux下TCP/UDP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。

2.编写Linux下TCP/UDP客户端套接字程序,结合实验一的服务器端程序,实现以下功能:1客户根据用户提供的IP地址连接到相应的服务器;2服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;3客户接收服务器发送的信息并显示。

四、实验原理使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图1.1所示。

1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

-----------------------------------------------------------------#include<sys/socket.h>int socket(int family,int type,int protocol);返回:非负描述字---成功-1---失败-----------------------------------------------------------------第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。

信息安全试验

信息安全试验

目录1.实验一网络通信安全1.1实验目的-------------------------------------------31.2实验内容-------------------------------------------31.3相关知识-------------------------------------------31.4实验设计-------------------------------------------51.5实验成果-------------------------------------------71.6实验小结-------------------------------------------9 2.实验二网络攻防2.1实验目的------------------------------------------102.2实验内容------------------------------------------102.3实验原理------------------------------------------102.4实验步骤------------------------------------------102.5实验小结------------------------------------------14 3.实验三Web服务器配置3.1实验目的------------------------------------------153.2实验要求------------------------------------------153.3实验内容------------------------------------------153.4实验小结------------------------------------------29 4.实验四信息系统安全4.1实验目的------------------------------------------304.2实验内容------------------------------------------304.3实验设计------------------------------------------304.4实验成果------------------------------------------314.5实验小结------------------------------------------34实验一网络通信安全1.1实验目的通过本章的学习,使学生掌握密码学在通信安全中的具体应用。

服务器和客户端通信

服务器和客户端通信

实验六基于TCP/IP的网络编程1 实验目的MFC提供的关于网络应用的类CSocket是一个比较高级的封装,使用它编制出属于自己的网络应用程序,可以编一个属于自己的网络通讯软件。

通过这个实验,同学们也可以增进对于TCP/IP协议的理解。

2 实验内容基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。

设计思路(VC6.0下):第一部分服务器端一、创建服务器套接字(create)。

二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。

三、接受来自用户端的连接请求(accept)。

四、开始数据传输(send/receive)。

五、关闭套接字(closesocket)。

第二部分客户端一、创建客户套接字(create)。

二、与远程服务器进行连接(connect),如被接受则创建接收进程。

三、开始数据传输(send/receive)。

四、关闭套接字(closesocket)。

CSocket的编程步骤:(注意我们一定要在创建MFC程序第二步的时候选上Windows Socket 选项,其中ServerSocket是服务器端用到的,ClientSocket是客户端用的。

)(1)构造CSocket对象,如下例:CSocket ServerSocket;CSocket ClientSocket;(2)CSocket对象的Create函数用来创建Windows Socket,Create()函数会自行调用Bind()函数将此Socket绑定到指定的地址上面。

如下例:ServerSocket.Create(823); //服务器端需要指定一个端口号,我们用823。

ClientSocket.Create(); //客户端不用指定端口号。

(3)现在已经创建完基本的Socket对象了,现在我们来启动它,对于服务器端,我们需要这个Socket不停的监听是否有来自于网络上的连接请求,如下例:ServerSocket.Listen(5);//参数5是表示我们的待处理Socket队列中最多能有几个Socket。

报告:实验四:非阻塞通信

报告:实验四:非阻塞通信

网络程序设计实验报告实验四:非阻塞模式--异步通信实验类型:验证指导教师:专业班级:姓名:学号:电子邮件:实验地点:实验日期:实验成绩:__________________________一、实验目的1、在上述I/O模型中自选一个I/O模型,构建一个TCP服务器,该服务器能:●接受客户端连接时显示客户端的IP,PORT信息●接收客户端连接时显示其连接编号,客户端退出时显示关闭的连接编号●能显示客户端发来的数据●能从键盘输入数据并发到客户端2、编写客户端程序,使之能:●从键盘输入数据并发送到服务器●能接收服务器发来的数据●当输入“bye”时退出程序二、实验设计●接受客户端连接时显示客户端的IP,PORT信息服务器recvfrom后,使用得到的隐式客户机SOCKADDR_IN信息来显示CString c;c.Format("%s:%d say:%s",::inet_ntoa(m_sockServerAddr.sin_addr),::ntohs(m_sockServerAddr.sin_port),msg.msg ); list.InsertString(0,c);●接收客户端连接时显示其连接编号,客户端退出时显示关闭的连接编号用对方的IP+port来做一个编号,可以做到编号唯一●能显示客户端发来的数据服务器recvfrom后,将缓冲区的内容插入到列表控件中list.InsertString(0,"发送数据发生错误。

");●能从键盘输入数据并发到客户端为编辑框定义一个变量来存储输入的字符串,然后用sendto将其发送出去。

●当输入“bye”时退出程序在数据发送之前加一个判断,要是满足,就关闭对话框if(strcmp(str,"bye")==0)::SendMessage(m_hWnd,WM_CLOSE,0,0);三、实验过程(包含实验结果)发送:需要一个发送函数接收:需要创建的只是对FD_READ网络事件感兴趣的异步通信模式WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_READCLOSE,FD_READ);需要一个回调函数,来处理自定义的消息,其中只需处理FD_READ。

TCP UDP客户服务器实验报告

TCP UDP客户服务器实验报告

《计算机网络》课程综合实验报告之TCP/UDP服务器端和客户端程序设计院系:信息工程学院专业:电子信息工程姓名:荆林风学号:20142410232一、实验目的学习和掌握Linux环境下的TCP和UDP通信服务器和客户端的基本编程方法和运行机制,掌握TCP/UDP报文段的通信过程。

二、实验平台win10操作系统下VMware Workstation工作环境下linux虚拟机,ubuntu操作系统三、实验内容1..编写Linux下TCP/UDP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。

2.编写Linux下TCP/UDP客户端套接字程序,结合实验一的服务器端程序,实现以下功能:1客户根据用户提供的IP地址连接到相应的服务器;2服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;3客户接收服务器发送的信息并显示。

四、实验原理使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图1.1所示。

1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

-----------------------------------------------------------------#include<sys/socket.h>int socket(int family,int type,int protocol);返回:非负描述字---成功-1---失败-----------------------------------------------------------------第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四客户/服务器通信实验一、实验目的1.学习Linux 的网络编程的基本知识2.理解socket结构和机制3.编写简单客户/服务器通信程序二、实验内容1.了解Linux 的网络编程的基本知识:TCP/IP协议,寻址机制,客户/服务器通信机制;2.理解端口的概念,熟悉socket有关的编程结构和函数,比如:socket(), bind(), connect(), listen(), accept(), send(), recv(), close();3.自己编写ip2uint()函数,把IP地址转换为unsigned int格式;4.参考附录中的源文件,在两个虚拟控制台分别实现分别服务器端和客户端功能,实现以下功能:1)服务器端程序通过一个连接向客户端发送字符串"Hello,world!\n”,画出客户端程序和服务器端程序的流程图;2)服务器端程序通过一个连接向客户端发送由客户端指定的文件,画出客户端程序和服务器端程序的流程图;5.在虚拟控制台分别编译、调试程序;三、实验指导与步骤按照以下步骤分别实现功能1和功能2:1、首先编写好服务器和客户端程序;2、打开一个虚拟终端,用gcc编译预先写好的服务器和客户端程序;3、运行服务器程序;4、打开另一个虚拟终端,运行客户端程序,连接成功后服务器给客户端发送数据;四、实验报告要求1.实验目的2.实验内容3.实验步骤记录自己实际完成的步骤,实验过程中所碰到的难题以及你解决问题的步骤和方法;4.实验技巧和心得体会附录:简单的客户/服务器通信示例一个建立分布式应用时最常用的范例便是客户机/服务器模型。

在这种方案中,客户应用程序向服务器程序请求服务,这种方式隐含了在建立客户机/服务器间通信的非对称性。

客户机/服务器模型工作时要求有一套为客户机和服务器所共识的协议,以保证服务能够被提供或被接收,它必须在通信的两端都被实现。

在非对称协议中,一方为主机(服务器),另一方则是从机(客户机)。

当服务被提供时必然存在“客户进程”和“服务进程”。

一个服务器通常在一个众所周知的端口监听对服务的请求。

也就是说,服务器一直处于休眠状态,直到一个客户对这个服务的端口提出连接请求。

在这个时刻,服务程序被唤醒并且为客户提供服务,对客户的请求做出了适当的反应。

其流程见图1。

服务器端客户机端Array图1 简单的服务器/客户机通信流程图例1:服务器端程序通过一个连接向客户发送字符串"Hello,world!\n”。

在PC机上运行服务器端程序,在开发板上运行客户端程序并输入服务器的IP地址,则开发板的LCD屏上能显示该字符串。

服务器端发送程序host.c:#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/wait.h>#include <sys/socket.h>#include <ctype.h>#define MYPORT 3000 /*定义服务器的监听端口*/#define Max 100 /*定义了服务器一次可以发送的字符数目*/#define BACKLOG 10 /*BACKLOG指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()函数接受它们*/main( ){int sock_fd,new_fd, numbytes,i; /*sock_fd,new_fd是套接字描述*/char buf[Max]; /*发送数据的缓冲区*/struct sockaddr_in my_addr; /*服务器的地址结构体*/struct sockaddr_in their_addr; /*主机的地址结构体*/int sin_size;if((sock_fd=socket(AF_INET,SOCK_STREAM,0))= =−1) /*建立流式套接字描述符*/ { perror("socket");exit(1);}/*服务器结构体的地址赋初值*/my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT); /*服务器的端口号*/my_addr.sin_addr.s_addr=INADDR_ANY;bzero(&(my_addr.sin_zero),8); /*填充0,凑齐长度*/if(bind(sock_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))= = −1) /*绑定*/{ perror("bindB"); /*绑定失败*/exit(1);}if(listen(sock_fd,BACKLOG)= =−1) /*监听端口是否有请求*/{ perror("listen"); /*监听失败*/exit(1);}while(1){sin_size=sizeof(struct sockaddr_in);if ((new_fd=accept(sock_fd,(struct sockaddr *)&their_addr,&sin_size))= =−1) { perror("accept");continue;}printf("server:got connection from %s\n",inet_ntoa(their_addr.sin_addr));if(!fork( )) /*子进程代码段:创建一个子进程,用来处理与刚建立的套接字的通信*/ { if(send(new_fd,"Hello,World! \n",14,0)= = −1) /*发送字符串*/{ perror("send");close(new_fd);exit(1);}close(new_fd); /*父进程不再需要该socket*/}}while(waitpid(−1,NULL,WNOHANG)>0); /*等待子进程结束,清除子进程所占用资源*/ return 0;}服务器首先创建一个socket,然后将该socket与本地地址/端口号捆绑,成功之后就在相应的socket上监听,当accpet捕捉到一个连接服务请求时,就生成一个新的socket,并调用fork( )函数产生一个子进程与客户机通信。

该子进程处理数据传输部分,通过这个新的socket向客户端发送字符串"Hello,world!\n",然后关闭该socket。

fork( )函数语句是一个单调用双返回的函数。

若调用成功,在子进程中返回的值为0,在父进程中返回子进程的进程标识号;若调用失败,则返回−1。

包含fork函数的if语句是子进程代码部分,它与if语句后面的父进程代码部分是并发执行的。

客户端接收程序ethernet.c:#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include "../gui/gui.h" /*用于LCD屏的显示*/#define PORT 3000 /*定义连接到服务器的端口号*/#define MAXDATASIZE 100 /*客户机一次可接收的最大传输量*//*延时程序,用于LCD屏的显示*/void delay( ){ int i,j;for(i=0;i<4500;i++)for(j=0;j<4000;j++) { }}/*将命令行输入的字符串IP地址转换成connect函数可识别的整数uiip*/int aiptoi(char * pszip,unsigned int* piip){char psziphere[17],*psztmp1,*psztmp2,*pchar; /*定义指针*/int i;bzero(psziphere,17); /*清空将要进行操作的数组*/strcpy(psziphere,pszip); /*将要转换的IP地址存入该数组*/strcat(psziphere,"."); /*在IP地址串的末尾加“·”*/for(i=0,psztmp1=psziphere,pchar=(char )piip;i<4;i++)/*循环4次,将“·”转变成0,并将字符串型转换成整型*/{if((psztmp2=strstr(psztmp1,"."))==NULL) /*psztmp2返回指向字符“·”位置的指针*/ return 0;psztmp2[0]=0;(pchar+i)=atoi(psztmp1); /*调用atoi( )函数,将字符串转换成整数*/psztmp1=psztmp2+1; /*指针psatmp1移到下一段的开始*/}return 1;}int main(int argc,char ** argv){int sockfd,numbytes;unsigned int uiip;char buf[MAXDATASIZE];int i;struct sockaddr_in servaddr;if(!aiptoi(argv[1],&uiip)||argc<=1) /*检查IP地址格式是否正确及IP是否输入*/ {printf("the ip is not correct or have not input the ip!\n");return 0;}if ((sockfd = socket(AF_INET,SOCK_STREAM,0))= =−1) /*建立流式套接字描述符*/ { perror("socket");exit(1);}/*给定主机信息*/servaddr.sin_family=AF_INET;servaddr.sin_port=htons(PORT);bzero(&(servaddr.sin_zero),8);servaddr.sin_addr.s_addr=uiip;if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr))==−1)/*建立连接*/{printf("Can't connect to the server!\n");return 0;}initgraph( ); /*初始化显示环境*/if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))== −1) /*接收服务器传送过来的字符串*/{ perror("recv");exit(1);}buf[numbytes]='\0';clearscreen( ); /*清屏*/textout(0,0,buf,0xffff,0x1111); /*显示字符串*/delay( );clearscreen();close(sockfd);return 0;}函数aiptoi()处理的是字符串型的IP地址。

相关文档
最新文档