实验一基于TCP套接字的文件传输客户服务器程序设计实验报告
网络编程实验报告
网络编程实验报告实验一TCP Socket API程序设计一、预备知识1.网络编程基本概念网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。
在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。
套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。
图1-1 TCP通信流程2.TCP通信流程TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。
二、实验目的1.了解Winsock API编程原理;2.掌握TCP Socket程序的编写;3.了解C/S模式的特点;4.学会解决实验中遇到的问题。
三、实验任务使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。
四、实验环境及工具1. Windows2000/XP/72. Visual C++开发平台3. Visual Studio2010五、实验内容和步骤参照《Visual C++网络编程教程》书中81页,TCP Socket API 程序设计。
连接:void CChatClientDlg::OnConnect(){WSADATA wsd; //WSADATA结构WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版m_client = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字//服务器地址sockaddr_in serveraddr;UpdateData();if(ServerIP.IsBlank()){AfxMessageBox("请指定服务器IP!");return;}if(sPort.IsEmpty()){AfxMessageBox("请指定端口!");return;}//获取服务器进程的IP和端口BYTE nFild[4];CString sIP;ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);//设置服务器地址结构的内容serveraddr.sin_family = AF_INET;serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);serveraddr.sin_port = htons(atoi(sPort));//发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) ! = 0){MessageBox("连接失败");return;}else{m_ListWords.AddString("连接服务器成功!");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLO SE); //①//界面完善ServerIP.EnableWindow(false);ServerPort.EnableWindow(false);m_ButtonConnect.EnableWindow(false);m_ButtonDisconnect.EnableWindow();m_EditWords.EnableWindow();m_ButtonSend.EnableWindow();m_ButtonExit.EnableWindow(false);m_ButtonClear.EnableWindow();}“断开”按钮的事件过程代码如下:void CChatClientDlg::OnDisconnect(){//断开与服务器的连接closesocket(m_client);m_ListWords.AddString("从服务器断开");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);ServerIP.EnableWindow();ServerPort.EnableWindow();m_ButtonConnect.EnableWindow();m_ButtonDisconnect.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);m_ButtonExit.EnableWindow();}“发送”按钮事件过程代码如下:void CChatClientDlg::OnSend(){//向服务器发送信息UpdateData();if(m_sWords.IsEmpty()){AfxMessageBox("发送的消息不能为空!");return;}//开始发送数据int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);m_ListWords.AddString("发送:" + m_sWords);m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}BOOL CChatClientDlg::PreTranslateMessage(MSG* pMsg){if(pMsg->message == 10000) //识别应用程序中定义的消息号{switch(pMsg->lParam) //判断网络事件类型{case FD_READ:this->ReceiveData(); //若为FD_READ则接收数据break;case FD_CLOSE:this->CloseSock(); //如果服务端断开,客户端也断开break;}}elsereturn CDialog::PreTranslateMessage(pMsg);}下面来实现ReceiveData()和CloseSock()方法。
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客户服务器实验报告
《计算机网络》课程综合实验报告之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。
tcp协议实验报告
tcp协议实验报告TCP协议实验报告一、引言在计算机网络中,TCP(Transmission Control Protocol)是一种常用的传输层协议,负责实现可靠的数据传输。
本实验旨在通过对TCP协议的实验研究,深入理解其工作原理和性能特点。
二、实验目的1. 理解TCP协议的基本原理和机制。
2. 掌握TCP协议的连接建立、数据传输和连接释放过程。
3. 了解TCP协议的流量控制和拥塞控制机制。
三、实验环境1. 操作系统:Windows 102. 实验工具:Wireshark、Python四、实验过程1. 连接建立在实验中,我们使用Python编写了一个简单的TCP服务器和客户端程序。
首先,客户端向服务器发起连接请求(SYN包),服务器接收到请求后发送确认包(SYN+ACK包),最后客户端发送确认包(ACK包)完成连接建立过程。
2. 数据传输在连接建立后,我们通过客户端向服务器发送数据,观察数据在网络中的传输情况。
Wireshark工具可以捕获和分析网络数据包,我们可以通过它来查看TCP 数据包的详细信息,包括源地址、目的地址、序列号、确认号等。
3. 连接释放当数据传输完成后,我们需要关闭TCP连接。
在实验中,我们模拟了正常关闭连接和异常关闭连接两种情况。
正常关闭连接时,客户端和服务器分别发送FIN包和ACK包,最后双方都发送FIN包完成连接释放。
异常关闭连接时,我们可以通过强制关闭客户端或服务器进程来模拟,观察TCP协议对连接异常关闭的处理过程。
五、实验结果通过实验,我们观察到TCP协议的一些重要特点和性能表现:1. 可靠性:TCP协议通过序列号和确认号机制,确保数据的可靠传输。
如果接收方收到的数据包乱序或丢失,TCP协议会要求发送方重新发送。
2. 流量控制:TCP协议通过滑动窗口机制实现流量控制,防止发送方发送速度过快导致接收方无法处理。
当接收方缓冲区已满时,会发送窗口为0的ACK包,告知发送方暂停发送。
tcp实验报告
tcp实验报告TCP实验报告一、实验目的TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在互联网通信中扮演着重要的角色。
本实验旨在通过实际操作和观察,深入理解TCP协议的工作原理和特点。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.93. 实验工具:Wireshark三、实验步骤与结果1. 建立TCP连接通过Python的socket库,我们可以轻松地创建TCP连接。
在本实验中,我们编写了一个简单的服务器端和客户端程序,通过本地主机进行通信。
2. 数据传输与流量控制在TCP连接建立后,我们进行了数据的传输实验。
首先,我们发送了一个较小的数据包,观察到数据包的传输过程中,TCP协议会自动进行流量控制,确保数据的可靠传输。
接着,我们发送了一个较大的数据包,发现TCP会将大数据包拆分成多个小数据包进行传输,并在接收端进行重组。
3. 拥塞控制为了模拟网络拥塞的情况,我们在实验中人为地降低了网络带宽。
通过Wireshark抓包分析,我们观察到TCP协议在发现网络拥塞时,会自动减少发送速率,以避免网络的过载。
同时,我们还注意到TCP协议会根据网络的状况动态调整拥塞窗口的大小,以提高网络的利用率。
4. 可靠性与重传机制为了测试TCP协议的可靠性,我们在实验中故意模拟了数据包丢失的情况。
通过Wireshark的分析,我们发现当发送端未收到确认消息时,会自动触发重传机制,确保数据的可靠传输。
同时,TCP还会根据超时时间的动态调整,以适应不同网络环境下的传输速度。
五、实验总结通过本次实验,我们深入了解了TCP协议的工作原理和特点。
TCP作为一种可靠的传输协议,在互联网通信中发挥着重要的作用。
它通过流量控制、拥塞控制和重传机制等手段,确保了数据的可靠传输,并适应了不同网络环境的变化。
在今后的学习和实践中,我们将进一步深入研究TCP协议的细节,并结合实际应用场景,优化网络通信的性能和可靠性。
winsock编程实验报告
winsock编程实验报告Winsock编程实验报告引言:Winsock(Windows Socket)是一种用于网络通信的编程接口,常用于开发基于TCP/IP协议的应用程序。
本篇文章将介绍我对Winsock编程的实验经历和心得体会。
实验目的:通过Winsock编程实验,深入了解网络通信原理和技术,掌握基于TCP/IP协议的应用程序开发方法。
实验环境:本次实验在Windows操作系统下进行,使用了Visual Studio 2019作为开发工具。
实验过程:1. 实验一:建立基于TCP的客户端/服务器通信在这个实验中,我首先创建了一个服务器程序和一个客户端程序。
服务器程序使用Winsock库函数创建了一个套接字,并绑定到指定的IP地址和端口上。
客户端程序通过Winsock库函数创建了一个套接字,并连接到服务器的IP地址和端口上。
通过这个实验,我学会了如何建立基于TCP的客户端/服务器通信。
2. 实验二:实现基于UDP的数据传输在这个实验中,我创建了一个基于UDP的数据传输程序。
UDP是一种无连接的传输协议,相对于TCP来说,它更加轻量级,适用于一些对数据可靠性要求不高的应用场景。
通过这个实验,我学会了如何使用Winsock库函数实现基于UDP的数据传输。
3. 实验三:实现多线程服务器在这个实验中,我将服务器程序改为多线程模式。
通过创建多个线程,服务器可以同时处理多个客户端的请求,提高了系统的并发性能。
这个实验让我更加深入地理解了多线程编程和网络通信的结合。
实验结果与分析:通过以上实验,我成功地实现了基于TCP和UDP的网络通信,并且在实验三中实现了多线程服务器。
在实验过程中,我遇到了一些问题,比如套接字的创建和绑定、连接的建立和断开等。
但通过查阅文档和调试,我最终解决了这些问题。
实验结果表明,Winsock编程是一种强大且灵活的工具,可以满足各种网络通信需求。
实验心得:通过本次实验,我对Winsock编程有了更深入的了解。
TCP套接字编程实验报告
西北师范大学计算机科学与工程学院
课程实验报告
接受客户连接;
读取客户的请求,发送应答;
终止连接并等待下一个客户连接。
实验设计思想描述
使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图所示。
调试过程及实验结果将A,B,C三台主机连接在同一局域网
1.在A主机打开TCP套接字服务器程序:
服务器创建成功,再查看A主机的IP地址为192.168.1.2
2. 在IP地址为192.168.1.3的B主机打开客户端程序,连接A主机:
3. 此时在A主机服务器端能看到B主机连接成功:
4. IP地址为192.168.1.5的C主机打开客户端程序,连接A主机:
连接成功,即可对话
5. 在A主机的服务器中可以看到C主机连接成功并受到C主机发来的信息:
总结
一直认为网络中传输数据是很复杂的事情,对套接字也只有泛泛的了解。
通过这次实验,我学到了很多,知道了TCP套接字的传输原理以及方法。
当真正接触套接字时,感觉还是挺有意思的,不过在编写程序时,还是感到有一定的困难,而且一定要综合考虑各方面的问题。
总之,这次实验给我带来了不小的收获,也为以后的学习和工作打下了良好的基础。
(完整word版)基于TCP的文件传输实验报告.docx
综合课程设计报告基于 TCP协议的文件传输系统学生姓名:指导教师:所在系:所学专业:年级:2011年6月目录摘要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2 1、的相关知 (3)1.1 、通信的模式 (3)1.1.1 、的可靠性 (3)1.2.1 、 TCP/IP 的网体系构 (3)1.2.2 、 TCP/IP 网 (4)1.2 . 3、 TCP——控制 (4)2、winsock 控件 (5)2.1.1 、 winsock 的重要属性、方法和事件 (5)2.1.2 、 winsock 控件通信的工作原理 (7)3、程序与 (8)3.1 、程序 (8)3.1.1 、体 (8)3.1.2 、模 (9)3.2 、程序 (10)3.2.1 、工作原理 (10)3.2.2 、服器端主程序 (11)3.2.3 、客端主程序 (14)4、 (17)参考文献...........................................................................................................17.成定 (18)基于TCP协议的文件传输系统摘要随着网络的普及,网络编程显得尤其重要。
本实验使用Winsock 控件实现两台计算机间的文件传输,描述了Winsock 控件的使用方法及有关文件传输的算法。
随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP 协议最为流行。
本文讨论的Winsock 控件,提供了访问TCP/IP 网络的捷径,使用它可以不必了解TCP/IP 的细节和调用Winsock API ,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信,进行文件传输了。
同时为了便于传输文件过程中的中断现象,在实验时应该充分考虑断点续传问题,即中断文件传输后已经传输的文件不丢失,等到再传时,能继续接着传送。
套接字编程实验报告
一、实验目的1. 理解套接字编程的基本原理和概念。
2. 掌握TCP和UDP协议在套接字编程中的应用。
3. 能够使用套接字编程实现简单的网络通信。
二、实验环境1. 操作系统:Windows 102. 编程语言:C3. 开发环境:Visual Studio 2019三、实验内容1. 创建套接字2. 绑定套接字3. 监听套接字4. 接受连接5. 发送数据6. 接收数据7. 关闭套接字四、实验步骤1. 创建套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd;sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) {perror("socket error");exit(1);}printf("Socket created successfully\n"); return 0;}```2. 绑定套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd;struct sockaddr_in servaddr;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}printf("Socket bound successfully\n");return 0;}```3. 监听套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); return 0;}```4. 接受连接```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));return 0;}```5. 发送数据```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len); if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!")); close(newsockfd);close(sockfd);return 0;}```6. 接收数据```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!")); close(newsockfd);close(sockfd);return 0;}```7. 关闭套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!"));close(newsockfd);close(sockfd);return 0;}```五、实验总结通过本次实验,我们掌握了套接字编程的基本原理和概念,学会了如何使用套接字实现简单的网络通信。
计算机网络编程实验报告(实现TCP、UDP数据传输)
package internet;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import .Socket;
package internet;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import .ServerSocket; import .Socket;
建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接 的状态,实时监控网络状态,等待客户端的连接请求。
public class UDPserver { public static void main(String[] args) throws IOException{ /* * 接收客户端发送的数据 */ DatagramSocket socket=new DatagramSocket(10086); // 创 建 服 务 器 端
的连接
System.out.println(s.getInetAddress().getHostAddress()+"...connection");
文件传输协议的简单设计与实现
文件传输协议的简单设计与实现摘要:文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
本设计是用JAVA语言简单实现文件传输协议,利用SOCKET以及SERVERSOCKE等类方法,当中实现了上传、下载、获取服务器目录等基本文件传输功能。
关键字:文件传输、FTP。
1具体设计任务1.1实验内容我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。
各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。
实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。
本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。
1.2具体要求用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录:显示你提供的命令quit :退出返回此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。
2基本思路及所涉及的相关理论2.1文件传输协议网络协议是网络中计算机与终端之间正确传送信息和数据的规范格式,起包括语法、语义和时序这三部分。
文件传输协议(File Transfer Protocol, FTP)是在TCP/IP网络中传输文件的一种格式规范,其规定在用户和服务器之间开设两个通信端口:控制端口和数据端口。
前者生存周期为从用户登录开始直至用户登出,后者则在进行数据传送的时候打开,并且在数据传送完毕之后立即结束。
控制端口用来监听双方共同规定的控制字以达到及时提供服务或响应,数据端口则要先将文件拆分成分组再进行传送,这样做的目的是为了更加好的适应网络中的带宽限制,以及减少传送期间节点的延时,以达到高速传送。
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。
TCP实验报告1
TCP/IP协议分析实验一报告姓名:李云弟学号:1205110115班级:网工1201班指导老师:孙平实验1 Linux操作系统的基本文件IO使用1、实验目的:本次实验是一个验证性实验,主要目的是让学生熟悉Linux操作系统中基本文件IO系统调用的使用。
因为文件IO系统调用是Linux网络套接字编程的一个最为基本的,必须把握的知识点,否则就很难很好的理解网络套接字编程的数据传输的机理。
2、实验内容:本次实验的主要内容是利用Linux操作系统提供的基本文件IO系统调用编写一个C语言程序,该程序完成以下描述的功能:(1)以读的方式打开/etc/passwd这个文件,并将该文件中的内容读出;(2)在/tmp目录下创建一个名为”passwd_学号”的文件,将从/etc/passwd 文件中读出的内容完整的写入到新建的”passwd_学号”文件中。
3.实验代码:#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>int main(){static const int MAX_LEN = 4096;char buffer_read[MAX_LEN];const char *src_path = "/etc/passwd";int src_fd,read_size;if((src_fd = open(src_path,O_RDONLY))<0){perror("open failed:");}elseprintf("open file:%s with file descriptor %d OK\n",src_path, src_fd);if((read_size = read(src_fd,buffer_read,MAX_LEN))<0){perror("read failed:");}a’a’a’a’a’a’a’a’a’a’a’a’a’a’aprintf("%s",buffer_read);const char *des_path = "/tmp/passwd_1205110115";int des_fd,write_size;if((des_fd = open(des_path, O_CREAT | O_TRUNC | O_WRONLY,0666))<0){perror("open failed:");}elseprintf("open file:%s with file descriptor %d OK\n",des_path, des_fd);if((write_size = write(des_fd,buffer_read,strlen(buffer_read)))<0){perror("write failed:");}elseprintf("Successful writting %d bytes to %s\n",write_size,des_path);}4.实验截图:5.问题:程序通过使用linux内核提供的API来对文件系统进行操作,文件系统驱动在对具体的磁盘驱动器进行操作。
实现基于TCP套接字的简单的服务器与客户端通信实验报告
计算机科学与技术系实验(项目)报告一、基本信息二、目的与要求目的:通过实验掌握Linux环境下基于TCP套接字编程的基本步骤和方法。
要求:1.掌握网络编程的基本框架;2.了解客户端、服务器的基本概念;3.掌握TCP套接字编程的基本流程及程序的调试方法。
三、完成实验(项目)过程和效果内容:1.程序结构设计;2.程序数据设计;3.程序基本流程;4.编码、调试及运行。
server代码:client代码:步骤:1.程序结构设计1)服务器端结构先启动,进行socket、bind、listen、accept、一系列准备工作,然后如果没有建立连接,则服务器处于阻塞状态,等待客户端连接。
2)客户端结构。
客户端启动后,首先向服务器端发起建立连接的请求,得到同意后,连接建立成功,客户端和服务器端开始进行数据通信,客户机完成通信工程后释放链接,关闭套接字。
2.程序数据设计1)服务器端相关数据:监听套接字描述符、连接套接字描述符int sockfd,client_fd;服务器端地址struct sockaddr_in my_addr客户端地址struct sockaddr_in remote_addr2)客户端相关数据套接字描述符int sockfd;服务器端地址结构struct sockaddr_in serv_addr;保存接收到的数据char buf[MAXDATASIZE];接收的数据字符int recvbytes;3.程序基本流程图。
四、知识应用以及经验总结1.编写UDP通信程序?基于UDP协议进行通信不同于TCP,UDP套接字通讯方式是一种面向无连接的通信工程,通信双方不必建立连接即三次握手。
指定IP即可通信,但不可靠。
2.监听套接字和连接套接字的区别?监听套接字,用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。
当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
套接字编程实验报告
Programing 实验物联2班201208080228 赵智慧一、实验题目:利用套接字编程,编写出TCP和UDP的客户机、服务器程序进行交互二、实验代码:1.TCP服务器:package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .ServerSocket;import .Socket;public class TCPServer {public static void main(String[] args) throws IOException{ServerSocket server=new ServerSocket(7999);System.out.println("server ok");Socket socket=server.accept();BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream()));String str=bf.readLine();while(str!=null){System.out.println(str);str=bf.readLine();}}}2.TCP客户机:package TCP;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import .Socket;import .UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException{String sentence;InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);Socket clientSocket = new Socket("127.0.0.1",7999);sentence = inFromUser.readLine();OutputStream os = clientSocket.getOutputStream();PrintWriter oos=new PrintWriter(os);os.write(sentence.getBytes());clientSocket.close();}}3.UDP服务器:package UDP;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;public class UDPServer {public static void main(String[] args) throws Exception{DatagramSocket serverSocket = new DatagramSocket(9876); //所有发送和接收的数据都将通过该套接字//因为UDP无连接,所以无需创建一个新的套接字监听新的请求byte[] receive1 = new byte[1024];byte[] receive2 = new byte[1024];byte[] send1 = new byte[1024];byte[] send2 = new byte[1024];byte[] send3 = new byte[1024];while(true){DatagramPacket receivePacket = new DatagramPacket(receive1, receive1.length);serverSocket.receive(receivePacket);String str = new String(receivePacket.getData()); //从分组中提取出数据,并存入str中InetAddress ip = receivePacket.getAddress(); //提取IP地址int port = receivePacket.getPort(); //提取客户机端口号String ask = "请选择:1.将其转化为大写 2.将a字符替换为c字符";send1 = ask.getBytes();DatagramPacket sendPacket1 = new DatagramPacket(send1, send1.length, ip,port);serverSocket.send(sendPacket1);DatagramPacket receivePacket2 = new DatagramPacket(receive2, receive2.length);serverSocket.receive(receivePacket2);String str2 = new String(receivePacket2.getData());if(str2.toCharArray()[0]=='1'){String capitalizedSentence = str.toUpperCase();send3 = capitalizedSentence.getBytes();DatagramPacket sendPacket3 = new DatagramPacket(send3, send3.length, ip,port);serverSocket.send(sendPacket3);}else{String change = str.replace('a', 'c');send2 = change.getBytes();DatagramPacket sendPacket2 = newDatagramPacket(send2, send2.length, ip,port);serverSocket.send(sendPacket2);}}}}4.UDP客户机:package UDP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;public class UDPClient {public static void main(String[] args) throws IOException{InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);DatagramSocket clientSocket = new DatagramSocket(); //客户机套接字InetAddress IPAddress = InetAddress.getByName("127.0.0.1");byte[] sendData1 = new byte[1024];byte[] sendData2 = new byte[1024];byte[] receiveData1 = new byte[1024];byte[] receiveData2 = new byte[1024];String sentence = inFromUser.readLine();sendData1 = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData1, sendData1.length,IPAddress,9876);clientSocket.send(sendPacket);DatagramPacket receivePacket1 = new DatagramPacket(receiveData1, receiveData1.length);clientSocket.receive(receivePacket1);String modifiedData1 = new String(receivePacket1.getData());System.out.println("Server:"+modifiedData1);String sentence2 = inFromUser.readLine();sendData2 = sentence2.getBytes();DatagramPacket sendPacket2 = new DatagramPacket(sendData2, sendData2.length,IPAddress,9876);clientSocket.send(sendPacket2);DatagramPacket receivePacket2 = new DatagramPacket(receiveData2, receiveData2.length);clientSocket.receive(receivePacket2);String modifiedData2 = new String(receivePacket2.getData());System.out.println("Server:"+modifiedData2);clientSocket.close();}}三、实验分析:TCP提供可靠的数据传输,而UDP提供不可靠的运输服务,在套接字编程方面,UDP 客户机使用的是DatagramSocket,而TCP客户机使用的是Socket。
网络编程文件传输实验报告
网络编程文件传输实验报告CKBOOD was revised in the early morning of December 17, 2020.基于TCP一、1、2、sockets 二、本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写TCP协议是其中重要的传输协议,为应用层提供可靠的端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。
Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。
此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windowssocket API应用程序能够在任何符合Windows socket协议的实现上工作。
三、设计概述1、创建套接字服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。
Socket()函数实现代码如下:SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);....\n");....\n");//得到主机开始传送消息recv(clientSocket,receiveBuf,101,0);printf("%s\n",receiveBuf);if(strcmp(receiveBuf,"开始传送")==0){//传送文件长度char sendBuf[20];ltoa(length,sendBuf,10);send(clientSocket,sendBuf,21,0);fseek(fp,0L,SEEK_SET);//传送文件long int y=0;double cent;char trans[SIZE];while(!feof(fp)){fread(trans,1,SIZE,fp);y=y+SIZE;if(y<length){cent=(double)y*(double)length;printf("已发送:%%\n",cent); send(clientSocket,trans,SIZE+1,0); } else{ send(clientSocket,trans,length+SIZE-y+1,0);closesocket(clientSocket); WSACleanup(); } }fclose(fp);}printf("文件发送完毕\n");system("pause");}四、实验结果及分析:客户端运行结果服务器端运行结果五、心得体会:网络编程的实验课虽然只有八次,但是我们充分了解了各种网络编程和winsock控件的知识,了解了TCP/IP协议的相关知识以及其中两个重要协议TCP UDP的特点与差异,进一步学习了文件传输等知识,创建套接字监听传输关闭等过程,直到最后写出C/S模式的文件传输程序感觉我们巩固了教材的内容实践的能力也得到了提高不足之处就是自己粗心大意,在写代码时候参数注解等经常注明的不够好,希望以后能养成良好的编程习惯。
C#套接字网络实验报告
计算机网络实验报告年级2009级学号2009432113 姓名吴紫薇成绩专业09计科1 实验地点主楼502 指导教师蔡红云实验项目套接字实验日期2012年5月一、实验目的1、了解网络通信原理。
2、实现基于TCP或UDP的网络通信数据传输服务。
3、掌握客户端/服务器程序设计。
4、掌握Socket编程的原理和实现方法。
二、实验原理1、套接字(socket)原理套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程要通过Internet进行通信,至少需要一对套接字,其中一个运行在客户端,称之为ClientSocket,另一个运行于服务器端面,称为ServerSocket。
根据连接启动的方式以及本地要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。
服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求。
连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。
而服务器端继续处于监听状态,继续接收其他客户端的连接请求。
2、套接字通信原理图图(1)套接字工作流程图3、套接字通信工作过程(1)、建立连接服务器(ServerSocket)监听指定端口,看是否有客户端的连接请求;客户端(ClientServer)创建套接字并通过指定端口请求与服务器建立连接。
服务器收到连接请求后,创建一个套接字与客户端建立连接。
计算机网络套接字编程实验报告
计算机网络套接字编程实验报告课程:计算机网络项目:实验2 套接字编程一、实验目的1掌握客户机与服务器的通信原理。
2掌握WinSocket编程技术,实现两机间的通信。
二、实验原理在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。
该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
2、等待客户请求到达该端口。
3、接收到重复服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求5、关闭服务器。
客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口。
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……3、请求结束后关闭通信通道并终止。
面向连接的应用程序流程图:三、实验内容:分别用TCP和UDP实现套接字编程,实现小写字母转大写!四、实验结果与分析:实验包含四个程序,如下:TCPClient:TCPServer:UDPClient:UDPSever:程序运行结果:需要把hostname改成主机IP地址,用ipconfig命令可得到本地IP。
运行结果:思考题:在一台主机上安装编译用java写的TCPClient和UDPClient程序,在另一台主机上安装编译TCPServer和UDPServer程序。
那么1:在运行TCPCserver运行TCPClient会发生什么现象?为什么?2:在运行UDPCserver运行UDPClient会发生什么现象?为什么?3:如果你对客户机端和服务器端使用了不同的端口,将发生什么现象?答:1.2.3都什么都不会发生,因为tcp、udp server程序无非是绑定了一个特定的端口,但是client端使用的端口都是随机产生的,不必要client 和server 的tcp和udp端口必须一致。
python底层网络接口TCP编程实验报告
网络编程实验报告实验题目:底层网络接口编程实验一、TCP编程1、需求分析tcp是面向连接的可靠的协议,适用于传输大批量的文件,检查是否正常传输。
tcp需要先建立连接才能通话 。
tcp可以形象比喻为打电话的过程,udp可以比喻为发短信的过程tcp不能发送广播和组播,只能单播2、概要设计3、详细设计(1)、伪代码:TCP服务器端:ss=socket() #创建服务器套接字ss.bind() #把本地地址绑到套接字上ss.listen() #监听连接inf_loop: #服务器无限循环cs=ss.accept() #接受客户端的连接comm._loop: #通信循环cs.recv()/cs.send() #对话cs.close() #关闭客户套接字ss.close() #关闭服务器套接字TCP客户端:cs=socket() #创建客户套接字cs.connect() #尝试连接服务器comm._loop: #通信循环cs.send()/cs.recv() #对话cs.close() #关闭套接字(2)、TCP服务器脚本如下:from socket import * 导入socket所有内建方法from time import ctime 导入时间类#主机HOST = '' #''代表服务器为localhost #端口号PORT = 12345#缓存大小BUFSIZE = 1024#完整地址ADDR = (HOST, PORT)#参数SOCK_STREAM表示建立一个TCP服务器tcpSerSock = socket(AF_INET, SOCK_STREAM)#绑定到指定端口tcpSerSock.bind(ADDR)#最多连接5个客户端tcpSerSock.listen(5)while True:print 'Waiting for connection...'tcpCliSock, addr = tcpSerSock.accept()print '...connected from: ', addrwhile True:#接收客户端数据data = tcpCliSock.recv(BUFSIZE)if not data:breakprint 'Received from client:', data#向客户端发送数据tcpCliSock.send('[%s] %s' % (ctime(), data))#关闭连接tcpCliSock.close()tcpSerSock.close()注:一种友好的退出方法是把服务器的无限循环放在一个try-except语句的try子句当中,并捕获EOFError和KeyboardInterrupt异常,在异常处理子句中,调用close()函数关闭服务器的套接字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011年秋季学期《计算机网络II》实验报告考核科目:计算机网络II学生所在院(系):计算机科学与技术学院学生所在学科:姓名:学号:实验时间:2011年11月29日一、问题描述1.实验名称:基于TCP套接字的文件传输客户服务器程序设计2.实验目的:掌握基于TCP套接口的网络程序设计。
掌握大规模文件传输的基本方法。
3.实验要求:服务器程序分别实现迭代服务器,并发服务器,使用单进程和select 的TCP服务器。
服务器在客户提出请求后向客户发送一个不小于1M大小的文件。
二、概要设计1.客户程序概要设计。
创建TCP套接口;指定服务器IP地址和端口;建立与服务器的连接;向服务器发送请求传送文件的请求“hello”;接受服务传输过来的数据;终止程序。
2.迭代服务器概要设计。
创建TCP套接口;捆绑服务器众所周知端口到套接口;把套接口变成监听套接口;接受客户连接;读取客户的请求,发送应答;终止连接并等待下一个客户连接。
3.并发服务器概要设计。
创建TCP套接口;捆绑服务器众所周知端口到套接口;把套接口变成监听套接口;接受客户连接;调用fork()派生子进程处理连接,父进程等待新的连接请求并处理结束的子进程;子进程读取客户的请求,发送应答,数据传输结束后终止连接并退出。
4.使用单进程和select的TCP服务器概要设计。
创建TCP套接口;捆绑服务器众所周知端口到套接口;把套接口变成监听套接口;调用select初始化数据结构;阻塞于select;若监听套接字变为可读,accept新的连接;检查现有连接,若连接可读则读取客户请求,发送应答,数据传输结束后关闭当前连接并更新数据结构。
三、详细设计1.客户程序详细设计。
a)主要数据结构设计ipv4套接字地址结构struct in_addr{in_addr_t s_addr;};struct sockaddr_in{uint8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero[8];};字符数组char buf[MAXSIZE];b)主要函数功能socket(),connect(),writen(),readn(),close()int socket(int domain, int type, int protocol);指定期望的通信协议类型。
返回值:成功则为非负描述符,出错则为-1。
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);tcp客户用connect函数来建立与tcp服务器的连接。
ssize_t readn(int fd,void *vptr,size_t n);从一个描述字读n个字节到vptr所指的缓冲区。
ssize_t writen(int fd,const void*vptr,size_t n);从vptr所指的缓冲区中写n个字节到一个描述字。
int close(int fd);关闭描述字。
2.迭代服务器详细设计。
a)主要数据结构设计ipv4套接字地址结构(略)字符数组char buf[MAXSIZE];b)主要函数功能socket(),bind(),listen(),accept(),writen(),readn(),close()int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);bind函数把一个本地协议地址赋予一个套接字。
对于网际网协议,协议地址就是32位的ipv4地址或者128位的ipv6地址与16位的tcp或udp端口号的组合。
如果一个tcp客户或者服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时的端口。
int listen(int sockfd, int backlog);listen函数把一个未连接的套接字转换成一个被动的套接字,指示内核接受指向该套接字的连接请求。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);accept函数由tcp服务器调用,用于从已完成连接的队列队头返回下一个已完成连接。
如果已完成连接的队列为空,那么进程被投入睡眠。
3.并发服务器详细设计。
a)主要数据结构设计ipv4套接字地址结构(略)字符数组char buf[MAXSIZE];b)主要函数功能socket(),bind(),listen(),accept(),witen(),readn(),signal(),close()typedef void Sigfunc(int);Sigfunc * signal(int signo,Sigfunc * func);调用函数func处理信号signo。
4.使用单进程和select的TCP服务器详细设计。
a)主要数据结构设计ipv4套接字地址结构(略)字符数组char buf[MAXSIZE];b)主要函数功能socket(),bind(),listen(),accept(),writen(),readn(),select(),FD_SET(),FD_ISSET(),close()int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);void FD_CLR(int fd, fd_set *set);int FD_ISSET(int fd, fd_set *set);void FD_SET(int fd, fd_set *set);void FD_ZERO(fd_set *set);select()函数允许进程指示内核等待多个事件中的任意一个发生,并仅在一个或者多个事件发生或经过某指定的时间后才唤醒进程。
FD_CLR()清除描述字fd相应位;FD_ISSET()测试描述字fd相应位;FD_SET()在描述字集合中为fd设置相应位;FD_ZERO()初始化描述字集合。
四、实验结果迭代服务器并发服务器使用单进程和select的TCP服务器五、心得体会未知的事情总显的神秘,以前一直认为在网络中传输数据是很复杂的事情。
对“套接字”也只是有个泛泛的概念,知道网络编程要也能够到这个。
接触以后,感觉最基本的套接字编程还是挺简单的。
但是考虑到各种有可能发生的情况之后,程序就变得复杂了。
六、附录:(数据结构、核心代码)/*myfunc.h*/#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<errno.h>#include <sys/socket.h>#include <sys/types.h>#include <strings.h>#include <fcntl.h>#include <sys/types.h>#include <arpa/inet.h>#include <netinet/in.h>#include <netdb.h>#include <sys/stat.h>#include <sys/select.h>#include <sys/time.h>#include <signal.h>#include <sys/wait.h>#define SERV_PORT 9996#define MAXSIZE 1024typedef void Sigfunc(int);ssize_t readn(int fd,void *vptr,size_t n){ssize_t nleft;ssize_t nread;char * ptr;ptr = vptr;nleft = n;while(nleft>0){if((nread = read(fd,ptr,nleft))<0){if(errno == EINTR)nread = 0;elsereturn(-1);}else if(nread==0)break;nleft -=nread;ptr+=nread;}return(n - nleft);}ssize_t writen(int fd,const void*vptr,size_t n) {size_t nleft;ssize_t nwritten;const char * ptr;ptr = vptr;nleft = n;while (nleft>0){if((nwritten=write(fd,ptr,nleft))<=0){if(errno==EINTR)nwritten = 0;elsereturn(-1);}nleft-=nwritten;ptr+= nwritten;}return(n);}void sig_chid(int signo){pid_t pid;int stat;while((pid = waitpid(-1,&stat,WNOHANG))>0){printf("child %d terminated\n",pid);fflush(stdout);} return;}Sigfunc * signal(int signo,Sigfunc * func){struct sigaction act,oact;act.sa_handler = func;sigemptyset(&act.sa_mask);act.sa_flags = 0;if(signo == SIGALRM){#ifdef SA_INTERRUPTact.sa_flags|=SA_INTERRUPT;#endif}else{#ifdef SA_RESTARTact.sa_flags|=SA_RESTART;#endif}if(sigaction(signo,&act,&oact)<0)return(SIG_ERR);return(oact.sa_handler);}/*client.c*/#include"myfunc.h"int main(int argc,char **argv){int sockfd;struct sockaddr_in servaddr;if(argc!=2)printf("usage:tcpcli<IPaddress>");if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)printf("socket error!");bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);servaddr.sin_addr.s_addr=inet_addr(argv[1]);if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){printf("link error!%s\n",strerror(errno));return 0;}char asd[5]="hello";writen(sockfd,asd,5);char buf[MAXSIZE]={};int d=0;int = 0;int fds=open("",O_CREA T|O_RDWR|O_TRUNC,0666);while( (d=readn(sockfd,buf,MAXSIZE)))+= writen(fds,buf,d);printf(" : %d \n",);printf("The been received!\n");return 0;}/*server_1.c*/#include "myfunc.h"int main(int argc,char **argv){int n,m,b,listenfd,connfd;struct sockaddr_in servaddr;if(n=(listenfd = socket(AF_INET,SOCK_STREAM,0))<0)printf("listen error");bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port=htons(9996);if(m=(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)))<0) printf("bind error,%s",strerror(errno));if((b=listen(listenfd,3))<0)printf("blisten error");struct sockaddr_in clientAdd;for(;;){socklen_t len;len = sizeof(clientAdd);char buf[MAXSIZE];connfd = accept(listenfd, (struct sockaddr *)&clientAdd, &len);char qwe[5];readn(connfd,qwe,5);int fid= open("",O_RDWR,0666);int s= 0;int len1 = 0;while(s=readn(fid,buf,MAXSIZE))len1 = writen(connfd,buf,s);printf("serone The s been sent to the client!\n");close( connfd);}}/*server_2.c*/#include "myfunc.h"int main(int argc,char **argv){pid_t pid;int n,m,b,listenfd,connfd;struct sockaddr_in servaddr;void sig_chid(int);if(n=(listenfd = socket(AF_INET,SOCK_STREAM,0))<0)printf("listen error");bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port=htons(SERV_PORT);if(m=(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)))<0) printf("bind error,%s",strerror(errno));if((b=listen(listenfd,3))<0)printf("listen error");signal(SIGCHLD,sig_chid);struct sockaddr_in clientAdd;for(;;){socklen_t len;len = sizeof(clientAdd);char buf[MAXSIZE];int s= 0;if((connfd = accept(listenfd, (struct sockaddr *)&clientAdd, &len))<0){ if(errno == EINTR)continue;elseprintf("accept error\n");}if((pid=fork())==0){close(listenfd);char qwe[5];readn(connfd,qwe,5);int fid= open("",O_RDWR,0666);int len1 = 0;while(s=readn(fid,buf,MAXSIZE))len1 = writen(connfd,buf,s);printf("sertwo The s been sent to the client!\n");close(connfd);exit(0);}close(connfd);}}/*server_3.c*/#include"myfunc.h"int main(int argc, char **argv){int i,maxfd,maxi, listenfd, connfd,sockfd;int nready, client[FD_SETSIZE];fd_set rset;char buf[MAXSIZE];socklen_t clilen;struct sockaddr_in cliaddr, servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));listen(listenfd, 3);maxfd = listenfd;maxi = -1;for (i = 0; i < FD_SETSIZE; i++)client[i] = -1;FD_ZERO(&rset);for ( ; ; ) {FD_SET(listenfd, &rset);nready = select(maxfd+1, &rset, NULL, NULL, NULL);if (FD_ISSET(listenfd, &rset)==1) {clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);for(i =0;i<FD_SETSIZE;i++)if(client[i]<0){client[i] = connfd;break;}if(i==FD_SETSIZE){printf("too many clients");fflush(stdout);}FD_SET(connfd,&rset);if(connfd>maxfd)maxfd=connfd;if(i>maxi)maxi = i;if(--nready<=0)continue;}for(i=0;i<=maxi;i++){if((sockfd=client[i])<0)continue;if(FD_ISSET(sockfd,&rset)){char qwe[10];readn(connfd,qwe,5);int fid= open("",O_RDWR,0666);int s= 0;int len1 = 0;while(s=readn(fid,buf,MAXSIZE))len1 = writen(sockfd,buf,s);printf("The s been sent to the client!\n");close(sockfd);FD_CLR(sockfd,&rset);client[i]=-1;}}}return 0;}。