实验七:Linux Socket编程 实验报告

合集下载

linux socket编程案例

linux socket编程案例

linux socket编程案例如何使用Linux Socket编程案例实现网络通信?一、介绍Socket编程是Linux操作系统中用于实现网络通信的一种编程接口。

通过Socket编程,我们可以在不同的主机之间建立网络连接,并进行数据传输。

本文将通过一个案例,一步一步介绍如何使用Linux Socket编程实现一个简单的网络通信应用。

二、准备工作在开始编写Socket程序之前,我们需要确保已经安装了Linux操作系统,并且具备一定的编程基础。

以下是本文案例所使用的环境和工具:- 操作系统:Ubuntu 20.04 LTS- 编程语言:C++- 编译器:g++三、案例背景我们打算实现一个简单的客户端-服务器模型。

客户端将向服务器发送一段文本,并在服务器端进行反转后返回给客户端。

四、服务器端代码实现1. 首先,我们创建一个服务器端的Socket,用于接收客户端连接:cpp#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int main() {创建Socketint serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}设置监听地址struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8888);serverAddress.sin_addr.s_addr = INADDR_ANY;绑定Socket和地址if (bind(serverSocket, (struct sockaddr*)&serverAddress,sizeof(serverAddress)) == -1) {std::cerr << "Failed to bind socket." << std::endl;return -1;}开始监听if (listen(serverSocket, 5) == -1) {std::cerr << "Failed to listen on socket." << std::endl;return -1;}std::cout << "Server started, listening on port 8888." << std::endl;接受客户端连接struct sockaddr_in clientAddress;socklen_t clientAddressLength = sizeof(clientAddress);int clientSocket = accept(serverSocket, (structsockaddr*)&clientAddress, &clientAddressLength);处理客户端请求...关闭Socketclose(serverSocket);return 0;}以上代码中,我们先创建一个Socket对象,然后设置服务器的监听地址,接着绑定Socket和地址,最后开始监听客户端连接。

socket编程实验报告

socket编程实验报告

socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它允许不同的计算机之间进行数据交换和通信。

通过实验,我们可以更深入地了解Socket编程的原理和应用。

实验目的:1. 了解Socket编程的基本原理和概念2. 掌握Socket编程的基本操作和使用方法3. 实现简单的客户端和服务器端通信实验环境:1. 操作系统:Windows或Linux2. 编程语言:C/C++或Python实验步骤:1. 理解Socket编程的基本原理和概念,包括TCP和UDP协议2. 编写客户端程序,建立与服务器端的连接3. 编写服务器端程序,接受客户端的连接并进行数据交换4. 测试客户端和服务器端的通信功能,包括发送和接收数据实验结果:通过实验,我们成功实现了简单的客户端和服务器端通信。

我们能够在客户端发送数据,服务器端接收并处理数据,然后再将处理结果返回给客户端。

这证明了Socket编程的可行性和实用性。

实验总结:Socket编程是一种强大而灵活的通信方式,它可以实现不同计算机之间的数据交换和通信。

通过本次实验,我们更加深入地了解了Socket编程的原理和应用,掌握了基本的操作和使用方法。

我们相信在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

通过这次实验,我们对Socket编程有了更深刻的理解,也提升了我们的编程能力和实践能力。

我们相信,在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

Socket编程报告

Socket编程报告

Socket编程报告(TCP/IP协议)一.实验目的通过C++来实现TCP/IP协议下的Socket编程,掌握TCP协议的算法实现。

二.实验原理客户端建立Socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用CloseSocket关闭Socket服务端建立Socket,声明自身的端口号和地址并绑定到Socket,使用Listen打开监听,然后不断用Accept去查看是否有连接,如果有,捕获Socket,并通过Recv获取消息的内容,通信完成后调用CloseSocket关闭这个对应Accept到的Socket,如果不再需要等待任何客户端连接,那么用CloseSocket关闭掉自身的Socket三.实验代码(C++实现)服务器端代码如下:#pragma once#include <stdio.h>#include <winsock.h>#pragma comment (lib,"ws2_32.lib")class CServerNet{public://初始化服务器,返回0表示成功int Init(const char* address,int port);//更新数据void Run();private:SOCKET m_sock;};int CServerNet::Init( const char* address,int port ) {int rlt = 0;//用于记录错误信息,并输出int iErrorMsg;//初始化WinSockWSAData wsaData;iErrorMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrorMsg != NO_ERROR){//初始化WinSock失败printf("wsastartup failed with error : %d\n",iErrorMsg);rlt = 1;return rlt;}//创建服务端Socketm_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (m_sock == INVALID_SOCKET){//创建Socket异常printf("socket failed with error : %d\n",WSAGetLastError());rlt = 2;return rlt;}//声明信息sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = port;serverAddr.sin_addr.s_addr = inet_addr(address);//绑定iErrorMsg = bind(m_sock,(sockaddr*)&serverAddr,sizeof(serverAddr));if (iErrorMsg < 0){//绑定失败printf("bind failed with error : %d\n",iErrorMsg);rlt = 3;return rlt;}return rlt;}void CServerNet::Run(){//公开连接listen(m_sock,5);sockaddr_in tcpAddr;int len = sizeof(sockaddr);SOCKET newSocket;char buf[1024];int rval;do{//接收信息newSocket = accept(m_sock,(sockaddr*)&tcpAddr,&len); if (newSocket == INVALID_SOCKET){//非可用socket}else{//新socket连接printf("new socket connect : %d\n",newSocket);//消息处理do{printf("process\n");//接收数据memset(buf,0,sizeof(buf));rval = recv(newSocket,buf,1024,0);if (rval == SOCKET_ERROR)//这应该是个异常,当客户端没有调用closeSocket 就直接退出游戏的时候,将会进入这里printf("recv socket error\n");if (rval == 0)//recv返回0表示正常退出printf("ending connection");else//显示接收到的数据printf("recv %s\n",buf);}while(rval != 0);//关闭对应Accept的socketclosesocket(newSocket);}} while (1);//关闭自身的Socketclosesocket(m_sock);}int main(int argc, char **argv){CServerNet serverNet;int iRlt = serverNet.Init("127.0.0.1",8888);if (iRlt == 0){printf("init ok...\n");serverNet.Run();}elseprintf("serverNet init failed with error : %d\n",iRlt);system("pause");}客户端代码如下:#pragma once#include <stdio.h>#include<windows.h>#pragma comment(lib, "Ws2_32.lib")class CClientNet{public://连接上指定服务器int Connect(int port,const char* address);//发送信息int SendMsg(const char* msg,int len);//关闭void Close();private:SOCKET m_sock;};int CClientNet::Connect( int port,const char* address ) {int rlt = 0;//用于记录错误信息并输出int iErrMsg;//启动WinSockWSAData wsaData;iErrMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrMsg != NO_ERROR)//有错误{printf("failed with wsaStartup error : %d\n",iErrMsg);rlt = 1;return rlt;}//创建Socketm_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (m_sock == INVALID_SOCKET)//创建Socket失败{printf("socket failed with error : %d\n",WSAGetLastError());rlt = 2;return rlt;}//目标服务器数据sockaddr_in sockaddrServer;sockaddrServer.sin_family = AF_INET;sockaddrServer.sin_port = port;sockaddrServer.sin_addr.s_addr = inet_addr(address);//连接,sock与目标服务器连接iErrMsg = connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrSe rver));if (iErrMsg < 0){printf("connect failed with error : %d\n",iErrMsg);rlt = 3;return rlt;}return rlt;}int CClientNet::SendMsg(const char* msg,int len){int rlt = 0;int iErrMsg = 0;//发送消息,指定sock发送消息iErrMsg = send(m_sock,msg,len,0);if (iErrMsg < 0)//发送失败{printf("send msg failed with error : %d\n",iErrMsg);rlt = 1;return rlt;}return rlt;}void CClientNet::Close(){closesocket(m_sock);}int main(){CClientNet client;//连接到127.0.0.1(即本地),端口号为8888的服务端printf("Connect\n");client.Connect(8888,"127.0.0.1");//发送消息printf("send msg\n");client.SendMsg("hello\0",sizeof("hello\0"));//关闭socketprintf("close\n");client.Close();system("pause");}四.实验结果五.心得体会通过本次实验,我了解了TCP/IP协议与UDP协议的异同之处,理解了Socket在通信中的地位和作用。

linux编程实验报告doc

linux编程实验报告doc

linux编程实验报告篇一:Linux程序设计实验报告《Linux程序设计》实验报告安徽工业大学计算机学院XX年6月1实验一 Linux基本命令的使用1、实验目的学习和掌握Linux的基本命令。

2、实验内容和步骤步骤1:以user_login用户身份并使用telnet登录Linux服务器,按照提示创建自己的账户和口令。

步骤 2:使用新创建的用户账户和口令登录Linux系统,察看登录后的界面。

步骤3:使用pwd命令察看当前的工作目录,然后用ls 命令查看当前目录下的内容,尝试使用-a,-l,-F,-A,-lF等不同选项并比较不同之处。

步骤4:在当前目录下建立一个名为test的新目录,然后将工作目录切换到test下,尝试将/etc目录下的文件passwd拷贝到该目录下(cp 源文件目的目录)。

察看当前目录下的passwd文件的属主和文件权限。

2步骤5:尝试向当前目录下的passwd文件和/etc/passwd 文件分别写入一些新内容(可使用echo “字符串” >>文件的命令),看看操作能否成功,如果不能成功,请说明原因。

用cat命令浏览文件password的内容,用more命令进行浏览翻页操作,再用less命令浏览文件的内容。

比较这几个命令的不同之处步骤6:用ls命令查看test下文件的权限,用mv命令更改文件password的文件名为test.txt,尝试用chown和chgrp更改文件的属主为root、组为root,看看能否成功,不成功,请说明原因。

尝试用chomd将文件权限为“-rw-------”。

看看能否成功,不成功,请说明原因。

3步骤7:用rm命令删除test目录下的所有文件,再用rmdir命令删除test目录。

(想一想有没有一条命令将目录及目录下的所有文件删除,写出这条命令)步骤8:使用ps命令查看当前系统内的进程,并利用man命令获取ps命令的参数,写出获取当前终端进程执行情况的ps命令。

计算机网络socket编程实验报告

计算机网络socket编程实验报告

Socket编程实验报告一、程序代码(1)服务器端#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { return; }if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ){ WSACleanup( );return; }SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口listen(sockSrv,SOMAXCONN); //SOMAXCONN由系统确定请求数SOCKADDR_IN addrClient;// 连接上的客户端ip地址int len=sizeof(SOCKADDR);while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址char sendBuf[50];sprintf(sendBuf,"Welcome %s tohere!",inet_ntoa(addrClient.sin_addr));// 组合消息发送出去send(sockConn,sendBuf,strlen(sendBuf)+1,0);// 发送消息到客户端char recvBuf[50]; recv(sockConn,recvBuf,50,0);// 接受客户端消息printf("%s\n",recvBuf);closesocket(sockConn);WSACleanup();//断开连接}}(2)客户端代码#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){WORD wVersionRequested;WSADATA wsaData;//WSAata用来存储系统传回的关于WinSocket的资料。

Socket网络编程实验指导

Socket网络编程实验指导

实验七 Socket网络编程一、学时:4二、实验类型:设计性实验三、实验目的:1.熟悉VisualC++的基本操作。

2.基本了解基于对话框的windows应用程序的编写过程。

3.对于Windows Socket编程建立初步概念。

四、实验内容:利用Socket编写聊天程序。

五、实验原理:一、Windows Socket和套接口的基本概念套接口,就是一个指向传输提供者的句柄。

Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。

Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。

Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。

使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。

此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。

Winsock提供了一种可为指定传输协议打开、计算和关闭会话的能力。

在Windows下,TCP/IP上层模型在很大程度上与用户的Winsock应用有关;换言之,用户的Winsock应用控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。

套接口有三种类型:流式套接口、数据报套接口及原始套接口。

流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。

数据报套接口定义了一种无连接的服务(UDP 协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。

Linux Socket 编程实验

Linux Socket 编程实验

实验6. Linux Socket 编程实验1、实验目的:(1) 了解TCP/IP 协议;(2) 掌握socket 编程。

2、实验设备:(1) PC 机的VMware 虚拟机运行Ubuntu Linux 系统;(2) 两机对连的网络线;(3) 带网口的测试计算机;(4) WINDOWS“SOCKET TOOL”调试工具。

3、实验内容:实现典型客户机/服务器程序中的服务器及客户机。

4、实验原理4.1 客户机/服务器工作流程使用TCP协议的客户机/服务器进程的工作过程如下图4.2 Socket 编程相关函数常用的socket函数有:socket,bind,listen,accept,connect,send,recv。

1)socket(建立连接)表头文件:#include<sys/types.h>#include<sys/socket.h>定义函数:int socket(int family,int type,int protocol);函数说明:socket()函数用来生成一个套接口描述字,也称为套接字,指定协议簇和套接口。

参数:family指定协议族,type指明字节流方式,而protocol一般为0Family的取值范围:AF_LOCALUNIX协议族AF_ROUTE路由套接口AF_INETIPv4协议AF_INET6IPv6协议AF_KEY密钥套接口参数type的取值范围:SOCK_STREAMTCP套接口SOCK_DGRAMUDP套接口SOCK_PACKET支持数据链路访问SOCK_RAM原始套接口返回值:成功返回非负描述字,失败返回负值2)bind(对socket定位)表头文件:#include<sys/types.h>#include<sys/socket.h>定义函数:Int bind(int sockfd,struct sockaddr * my_addr,int addrlen);函数说明bind()用来设置给参数sockfd的socket一个名称。

linux编程 实验报告

linux编程 实验报告

linux编程实验报告Linux编程实验报告一、引言Linux操作系统是一种自由开源的操作系统,具有稳定性、安全性和灵活性等优点,被广泛应用于服务器、嵌入式系统和个人电脑等领域。

本实验旨在通过编程实践,探索Linux编程的基本概念和技术,并通过实验结果验证相关理论。

二、实验目的本实验的主要目的是通过编写C语言程序,理解Linux系统调用的原理和使用方法。

具体目标包括:1. 熟悉Linux系统调用的概念和基本原理;2. 掌握Linux系统调用的常用函数及其使用方法;3. 理解文件操作、进程管理和网络编程等方面的基本知识。

三、实验环境本实验使用的实验环境为Ubuntu 20.04 LTS操作系统。

在该系统上,我们可以使用gcc编译器编译C语言程序,并通过终端执行程序。

四、实验内容1. 文件操作文件操作是Linux编程中的重要内容之一。

通过使用系统调用函数,我们可以实现对文件的读写、创建和删除等操作。

在本实验中,我们编写了一个简单的文件复制程序,实现将一个文件的内容复制到另一个文件中。

2. 进程管理进程是Linux系统中的基本执行单元。

通过创建和管理进程,我们可以实现并发执行和多任务处理等功能。

在本实验中,我们编写了一个简单的多进程程序,实现同时执行多个任务的效果。

3. 网络编程网络编程是Linux编程中的一个重要领域,它涉及到网络通信、套接字编程和网络协议等内容。

在本实验中,我们编写了一个简单的客户端-服务器程序,实现了基于TCP协议的网络通信。

五、实验结果与分析通过实验,我们成功编写了文件复制程序、多进程程序和客户端-服务器程序,并在实验环境中运行和测试了这些程序。

实验结果表明,我们对Linux编程的基本概念和技术有了初步的理解和掌握。

在文件复制程序中,我们使用了open、read和write等系统调用函数,实现了将源文件的内容复制到目标文件中。

通过实验测试,我们发现该程序能够正确地复制文件,保持了源文件的内容和结构。

网络工程网络编程实验报告2-Socket编程

网络工程网络编程实验报告2-Socket编程

《网络编程》实验报告实验序号:02 实验项目名称:Socket编程学号姓名专业、班20网络工程实验地点指导教师实验时间2022一、实验目的及要求掌握Socket编程的基本原理,调试并在代码标注注释:(1) ServerSocket, ClientSocket(2) SimpleClient, SimpleServer(3) PortScanner(4) Sender, Receiver(5) SenderClient, ReceiverSever二、实验设备(环境)及要求一台Windows XP、JDK1.6、MyEclipse 8.5三、实验内容与步骤1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。

3.第三个实验是扫描1-1024端口有没有被服务器监听。

4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。

3.第三个实验是扫描1-1024端口有没有被服务器监听。

4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理附源程序清单:1. EchoServerpackage Hello;import java.io.*;import .*;public class EchoServer {private int port=8000;//监听端口号private ServerSocket serverSocket;public EchoServer() throws IOException {serverSocket = new ServerSocket(port);//创建一个SocketSystem.out.println("服务器启动");}public String echo(String msg) {return "echo:" + msg;}private PrintWriter getWriter(Socket socket)throws IOException{////参数socket 表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream();//获得输入流,获得用户的请求//数据流输入return new BufferedReader(new InputStreamReader(socketIn));}public void service() {while (true) {Socket socket=null;try {socket = serverSocket.accept(); //等待客户连接System.out.println("New connection accepted "+socket.getInetAddress() + ":" +socket.getPort());BufferedReader br =getReader(socket);PrintWriter pw = getWriter(socket);String msg = null;while ((msg = br.readLine()) != null) {System.out.println(msg);pw.println(echo(msg));if (msg.equals("bye")) //如果客户发送消息为“bye”,就结束通信break; }}catch (IOException e) {e.printStackTrace();}finally {try{if(socket!=null) socket.close(); //断开连接}catch (IOException e) {e.printStackTrace();}} } }// service() 方法结束public static void main(String args[])throws IOException {new EchoServer().service();}}import .*;import java.io.*;import java.util.*;public class EchoClient {//创建客户端private String host="localhost";//当参数host 的取值为“localhost”,表示EchoClient与EchoServer进程运行在同一个主机上private int port=8000;//监听端口号8000private Socket socket;public EchoClient()throws IOException{socket=new Socket(host,port); //建立连接}public static void main(String args[])throws IOException{//输入输出new EchoClient().talk();}private PrintWriter getWriter(Socket socket)throws IOException{//发送数据OutputStream socketOut = socket.getOutputStream();//获得输出流return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream(); //获得输入流return new BufferedReader(new InputStreamReader(socketIn));}public void talk()throws IOException {try{BufferedReader br=getReader(socket);PrintWriter pw=getWriter(socket);BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));String msg=null;while((msg=localReader.readLine())!=null){pw.println(msg);System.out.println(br.readLine());if(msg.equals("bye"))break;}}catch(IOException e){e.printStackTrace();}finally{//关闭流和连接try{socket.close();}catch(IOException e){e.printStackTrace();} }}}2. .SimpleClientimport java.io.*;import .*;public class SimpleClient {public static void main(String args[])throws Exception {Socket s1 = new Socket("localhost",8000);System.out.println("第一次连接成功");Socket s2 = new Socket("localhost",8000);System.out.println("第二次连接成功");Socket s3 = new Socket("localhost",8000);System.out.println("第三次连接成功");}package Hello;import java.io.*;import .*;public class SimpleServer {public static void main(String args[])throws Exception {ServerSocket serverSocket = new ServerSocket(8000,2); //连接请求队列的长度为2Thread.sleep(360000); //睡眠6分钟}}3. import .*;import java.io.*;public class PortScanner { public static void main(String args[]){String host="localhost";//当参数host 的取值为“localhost”,表示Client与Server进程运行在同一个主机上if(args.length>0)host=args[0];new PortScanner().scan(host);}public void scan(String host){//扫描1-1024端口Socket socket=null;for(int port=1;port<1024;port++){try {//try catch语句判断输出socket = new Socket(host, port);System.out.println("There is a server on port "+port);//如果有连接There is a server on port,} catch (IOException e) {System.out.println("Can't connect to port "+port);//如果没有连接Can't connect to port} finally {try {if(socket!=null)socket.close();//断开连接} catch (IOException e) {e.printStackTrace();}}}}4. Senderimport java.io.*;import .*;public class Receiver { private int port=8000;private ServerSocket serverSocket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int INPUT_STOP=4; //关闭输入流,再结束程序private final int SERVERSOCKET_STOP=5; //关闭ServerSocket,再结束程序public Receiver() throws IOException {serverSocket = new ServerSocket(port);System.out.println("服务器已经启动");}private BufferedReader getReader(Socket socket)throws IOException{ InputStream socketIn = socket.getInputStream();return new BufferedReader(new InputStreamReader(socketIn));}public void receive() throws Exception{Socket socket=null;socket = serverSocket.accept();BufferedReader br =getReader(socket);for(int i=0;i<20;i++) {String msg=br.readLine();System.out.println("receive:"+msg);Thread.sleep(1000);if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");socket.close();break;}else if(stopWay==INPUT_STOP){System.out.println("关闭输入流并终止程序");socket.shutdownInput();break;}else if(stopWay==SERVERSOCKET_STOP){System.out.println("关闭ServerSocket并终止程序");serverSocket.close();break;}}}if(stopWay==NA TURAL_STOP){socket.close();serverSocket.close();}}public static void main(String args[])throws Exception {if(args.length>0)stopWay=Integer.parseInt(args[0]);new Receiver().receive();}}Receiverimport .*;import java.io.*;import java.util.*;public class Sender {private String host="localhost";private int port=8000;private Socket socket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int OUTPUT_STOP=4; //关闭输出流,再结束程序public Sender()throws IOException{socket=new Socket(host,port);}public static void main(String args[])throws Exception{if(args.length>0)stopWay=Integer.parseInt(args[0]);new Sender().send();}private PrintWriter getWriter(Socket socket)throws IOException{ OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}public void send()throws Exception {PrintWriter pw=getWriter(socket);for(int i=0;i<20;i++){String msg="hello_"+i;pw.println(msg);System.out.println("send:"+msg);Thread.sleep(500); //捕捉异常if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");//输出System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");//输出socket.close();break;}else if(stopWay==OUTPUT_STOP){socket.shutdownOutput();System.out.println("关闭输出流并终止程序");//输出break;}}}if(stopWay==NATURAL_STOP){socket.close();}}}5 SendClientimport java.io.*;import .*;public class SendClient {public static void main(String args[])throws Exception {Socket s = new Socket("localhost",8000);OutputStream out=s.getOutputStream();out.write("hello ".getBytes());out.write("everyone".getBytes());Thread.sleep(60000); //睡眠1分钟s.close();}}package Hello;import java.io.*;import .*;public class ReceiveServer { public static void main(String args[])throws Exception { ServerSocket serverSocket = new ServerSocket(8000);Socket s=serverSocket.accept();//s.setSoTimeout(20000);InputStream in=s.getInputStream();ByteArrayOutputStream buffer=new ByteArrayOutputStream();byte[] buff=new byte[1024];int len=-1;do{try{len=in.read(buff);if(len!=-1)buffer.write(buff,0,len);}catch(SocketTimeoutException e){System.out.println("等待读超时");len=0;}}while(len!=-1);System.out.println(new String(buffer.toByteArray())); //把字节数组转换为字符串}}。

计网socket编程实验报告

计网socket编程实验报告

深圳大学实验报告实验课程名称:计算机网络实验项目名称: Socket 编程学院:计算机与软件学院专业:计算机科学与技术报告人:学号:班级:同组人:指导教师:实验时间: 2015-05-10 提交时间: 2015年5月29日声明:本次实验内容由报告人和同组人独立完成,所有涉及到他人的工作均已说明。

报告人和同组人均同意教师及学校为教学活动而引用本实验的内容,且无需事先征得同意和特别说明。

教务处制一、实验目的了解FTP协议的工作原理,掌握基于socket的网络编程的基本原理。

二、实验要求用 Socket (WinSock)编程,实现简单的 FTP 客户端:客户端和 FTP 服务器建立 Socket 连接。

向服务器发送 USER、PASS 命令登录 FTP 服务器。

使用 PORT(或PASV)建立数据连接。

使用 NLST 进行文件列表。

使用 RETR / STOR 命令下载/上传文件。

在下载完毕后断开数据连接并发送 QUIT 命令退出。

服务器:Apache Friends 中的 FileZillaFTP,或是lab:lab @ 在整个交互的过程中,控制连接始终处于连接的状态。

数据连接在每传输一个文件时先打开,传输后关闭三、实验分析设计(1)服务端启动,等待用户连接(2)客户端启动,请求与服务端连接(3)服务端应答,与用户建立连接(4)用户输入目录操作、文件上传下载等指令,服务端接收到指令后进行解析,作出相应的响应(5)重复(4)的过程,直至用户输入quit指令要求离开,服务结束四、核心代码说明#pragma comment(lib,"ws2_32")#include<>#include<fstream>#include<iostream>#include<>#include<>#include<string>#include""using namespace std;#define MENU "Welcome To The FTP Server,Please Input The Command And Enter!Such as: LIST,CWD,RETR,STOR,DELE,RMD,MKD";cout<<Dir<<endl;client->sendCommand();client->receiveCommand();client->receiveList();client->receiveCommand();}else if(strcmp(Command,"CWD")==0||strcmp(Command,"cwd")==0){memset(Dir,NULL,512);cout<<"Plase input the dir of your will(compelete dir)::"<<endl;cin>>Dir;client->setCommand("CWD ",Dir);client->sendCommand();client->receiveCommand();}else if(strcmp(Command,"retr")==0||strcmp(Command,"RETR")==0){char* filename = new char[512];memset(filename,NULL,512);/************************************下载模块************************************/client->setCommand("PASV");client->sendCommand();client->receiveCommand();client->getPort();client->setCommand("TYPE","I");client->sendCommand();client->receiveCommand();client->interlizeDataSocket();cout<<"Please input the name you want to download:";cin>>filename;client->setCommand("RETR ",filename);client->sendCommand();client->receiveCommand();client->receiveData(filename);client->receiveCommand();delete filename;}else if(strcmp(Command,"stor")==0||strcmp(Command,"STOR")==0){char* filename = new char[512];memset(filename,NULL,512);/************************************上传模块************************************/client->setCommand("PASV");client->sendCommand();client->receiveCommand();client->getPort();client->setCommand("TYPE","I");client->sendCommand();client->receiveCommand();client->interlizeDataSocket();cout<<"Please input the name you want to UPload:";cin>>filename;client->setCommand("STOR ",filename);client->sendCommand();client->receiveCommand();client->sendData(filename);client->receiveCommand();delete filename;}else if(strcmp(Command,"dele")==0||strcmp(Command,"DELE")==0) <<endl;cout<<"Cleaning system resource"<<endl;//delete [] userName;//delete [] Direct;//delete client;cout<<"Exiting Goodbye"<<endl;system("pause");}五、测试与结果六、总结与分析本次实验达到了本项实验的初始目的和要求。

socket编程实验报告

socket编程实验报告

实验一Socket编程班级:电子商务08-2班学号:20085154姓名:杨阳一、目的通过socket程序的编写、调试,掌握socket编程的基本方法,促进学生对概念的理解,培养动手能力。

二、基本要求编写并调试教学中使用的socket程序示例,并加以修改,增加程序的功能。

完成实验后,需要按时提交实验报告。

三、实验内容服务器端程序代码:import java.io.*;import .*;public class Socketserver{public static void main(String args[]){Socket soc=null;InputStream is=null;OutputStream os=null;ServerSocket servSocket=null;try{servSocket=new ServerSocket(8000);// 调用ServerSocket类的构造方法,以8000端口号为参数,创建一个ServerSocket对象soc=servSocket.accept();//服务程序使用ServerSocket对象的accept( )方法接收来自客户程序的请求。

直到接收到从客户程序发来的连接请求(否则一直等待),然后该方法返回一个新建的Socket类的对象is=soc.getInputStream();//返回对socket的输入流的引用os=soc.getOutputStream();//返回对socket的输出流的引用BufferedReader in=new BufferedReader(new InputStreamReader(is));//通过InputStreamReader的对象is的读取,将值赋给in,基于字符流PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)),true);//通过BufferedWriter方法封装了os,将值赋给out,其方法取参数ture表示当读取数据时,即自动刷新缓存区,当该参数取flash时,只有当缓存区满时,才会刷新缓存区System.out.println("client'sIP:"+soc.getInetAddress());//getInetAddress()方法可以获得客户机的IP地址; System.out.println()表示向本地计算机反映相关信息System.out.println("client's port"+soc.getPort());//getPort()方法可以获得端口号out.println("welcome!");//该方法表示向客户端输出相关数据String s=in.readLine();//读取一行数据while(!s.equalsIgnoreCase("quit"))//当客户端的数据不为quit时{System.out.println("client said:"+s);s=in.readLine();}System.out.println("client wants to leave.");}catch(Exception e){System.err.println("socket wrong connetion");//输出错误信息e.printStackTrace();//出现异常时,打印整个方法调用名单}finally{//finally方法释放资源try{is.close();//关闭输入流os.close();//关闭输出流soc.close();//关闭SocketservSocket.close();//关闭ServerSockerSystem.out.println("over,successfully leasing resouce");}catch(Exception e){System.err.println("close socket wrong");//输出错误信息e.printStackTrace();//出现异常时,打印整个方法调用名单}}}}客户端程序代码:import java.io.*;import .*;public class Socketclient{public static void main(String args[]){Socket soc=null;InputStream is=null;OutputStream os=null;try{soc=new Socket("localhost",8000);System.out.println("connecting to the server");is=soc.getInputStream();os=soc.getOutputStream();BufferedReader in=new BufferedReader(new InputStreamReader(is));PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)),true);String s=in.readLine();System.out.println("server said:"+s);System.out.println("server's IP:"+soc.getInetAddress());System.out.println("server's Port"+soc.getPort());/*byte b[]=new byte[100];System.in.read(b);String ms=new String(b);*/BufferedReader in2=new BufferedReader(new InputStreamReader(System.in));//定义变量in2获取服务器端信息String ms=in2.readLine();//定义变量ms获取信息ms=ms.trim();while(!ms.equalsIgnoreCase("quit")){out.println(ms);ms=in2.readLine();ms=ms.trim();}out.println(ms);}catch(Exception e){System.err.println("socket error");e.printStackTrace();}finally{try{is.close();os.close();soc.close();System.out.println("over,leasing resource successfully");}catch(Exception e){System.err.println("close socket wrong");e.printStackTrace();}}}}服务器端程序的编写1调用ServerSocket类的构造方法,以某端口号为参数,创建一个ServerSocket 对象。

socket编程实验报告

socket编程实验报告

计算机网络实验题目:Socket编程实验1 基于UDP的Socket编程实验2 基于TCP的Socket编程姓名:学号:学院:年级:实验时间:目录一、实验内容: (3)实验1 基于UDP的Socket编程 (3)实验2 基于TCP的Socket编程 (3)二、程序设计 (3)1 基于UDP的Socket编程 (3)1.1 实验原理:基于UDP协议的无连接C/S的工作流程 (3)1.2 实现方案和实验结果 (4)1.2.1 方案1:Linux上两个进程间的通信 (4)方案1实现方案 (4)方案1实验结果 (4)1.2.2 方案2:Windows主机(client)和Linux虚拟机(server)之间的进程通信 6方案2实现方案 (6)方案2实验结果 (6)2 基于TCP的Socket编程 (7)2.1 实验原理:基于TCP协议的面向C/S的工作流程 (7)2.2 实现方案 (8)2.3 实验结果 (9)三、讨论与心得 (10)四、源代码 (12)一、实验内容:本单元实验包括的实验项目主要是UDP Socket编程和TCP Socket编程。

本单元实验的主要目的是希望通过本单元实验,让学员掌握Socket编程方法,同时通过本单元实验让学生掌握如何开发基于TCP/IP协议的网络应用。

实验1 基于UDP的Socket编程●实验目的:通过本实验使学员了解和掌握编写基于UDP协议的网络应用程序。

●实验内容:编写基于UDP协议网络聊天程序,要求发送程序和接收程序能够接收键盘输入并彼此之间相互发送数据。

●实验步骤:1.编写server端程序;2.编写client端程序;3.client程序与server程序联调;4.client程序与server程序相互通信。

实验2 基于TCP的Socket编程●实验目的:通过本实验使学员了解和掌握编写基于TCP协议的网络应用程序。

●实验内容:编写基于TCP协议网络聊天程序,要求发送程序和接收程序能够接收键盘输入并彼此之间相互发送数据。

Socket编程实验报告

Socket编程实验报告

实验报告实验一Socket编程一、实验目的通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。

二、实验内容①学习socket编程使用的类和接口,着重掌握基于TCP协议的socket。

②编写服务器端的应用程序③编写客户端的应用程序④实现服务器端与客户端的交互三、实验代码1.服务器端程序过程:在端口5000上创建一个等待连接的ServerSocket对象server:server=new ServerSocket(5000);接着调用server对象的accept()方法等待某客户程序发出连接请求。

该方法一直阻塞直到有客户连接到带端口。

一旦有客户发送正确请求,则连接成功,accept()方法返回一个Socket对象,于是得到了一个新的用于通信的Socket对象,通信链路建立成功。

然后利用Socket 类提供的方法创建Socket对象的输入流和输出流。

此后即于客户端进行通信,直到客户端断开连接即关闭各个流结束通信。

代码如下:import .*;import java.io.*;class aa{static public void main (String args[]) throws IOException{ServerSocket server=null;Socket socket=null;InputStream is=null;OutputStream os=null;DataInputStream in=null;PrintStream out=null;try{ //在端口5000注册服务server=new ServerSocket(5000);socket =server.accept();//侦听连接请求,等待连接System.out.println("**********************服务器端界面*************************");System.out.println("与客户端连接成功!");System.out.println("");System.out.println("对话内容为:");System.out.println("");System.out.println("等待客户发送信息.....");//获取对应的Socket的输入/输出流is=socket.getInputStream();os=socket.getOutputStream();//建立数据流in= new DataInputStream(is);out =new PrintStream(os);//表示向对方输出out.println("Welcome!");//表示向对方输出String str=in.readLine();//逐行读取do{System.out.println("客户端说:"+ str);str=in.readLine();}while(str.trim().equals("BYE")) //如果是“BYE”就退出System.out.println("客户想要离开");}catch(Exception e) //捕获程序异常{System.out.println("Error:"+e);}finally{is.close();//关闭输入流os.close();//关闭输出流in.close();//关闭数据输入流socket.close();//关闭socket}}}2.客户端程序过程:首先创建一个指向服务器的指定端口号(5000)的Socket对象socket:socket=new Socket("localhost",5000);此时服务器指定为本地计算机,若要在网络中指定服务器,只需要将参数localhost改成相应的服务器名或者IP地址即可。

计算机网络socket编程实验报告

计算机网络socket编程实验报告

Socket 编程实验报告一、程序代码( 1 )服务器端#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { return; }if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ){ WSACleanup( );return; }SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口listen(sockSrv,SOMAXCONN); //SOMAXCONN 由系统确定请求数SOCKADDR_INaddrClient;// 连接上的客户端ip 地址intlen=sizeof(SOCKADDR);while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接, 获取客户端的ip 地址charsendBuf[50];sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));// 组合消息发送出去send(sockConn,sendBuf,strlen(sendBuf)+1,0);// 发送消息到客户端charrecvBuf[50]; recv(sockConn,recvBuf,50,0);// 接受客户端消息printf("%s\n",recvBuf);closesocket(sockConn);WSACleanup();// 断开连接( 2)客户端代码#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib") void main(){WORD wVersionRequested;WSADATA wsaData;//WSAata 用来存储系统传回的关于WinSocket int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return;}if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( );return;}SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);// AF_INET ..tcp 连接,初始化连接与端口号SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");// 本机地址,服务器在本机开启addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);// 设置端口号connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//charrecvBuf[50];recv(sockClient,recvBuf,50,0);// 接受数据printf("%s\n",recvBuf);send(sockClient,"hello",strlen("hello")+1,0);// 发送数据closesocket(sockClient);// 关闭连接WSACleanup(); 的资料。

linux网络编程实验报告

linux网络编程实验报告
{
unsigned short int sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
structin_addr
{
uint32_t s_addr;
};
sin_family即为sa_family
(3)listen(等待连接)
相关函数socket,bind,accept,connect
表头文件#include<sys/socket.h>
定义函数int listen(int s,int backlog);
函数说明listen()用来等待参数s的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。返回值成功则返回0,失败返回-1,错误原因存于errno附加说明listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog最大值可设至128。错误代码EBADF参数sockfd非合法socket处理代码EACCESS权限不足EOPNOTSUPP指定的socket并未支援listen模式。
unsigned char sin_zero[8]; //未使用的字段,填充为0
};
套接字类型指的是在网络通信中不同的数据传输方式。例如UDP和TCP就是两种不同的套接字类型。常用的套接字类型有面3种:流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)。

socket实验报告

socket实验报告

中南大学Socket通信实验公共网络络班级信息安全0901学生王树雄学号0909090128教师王伟平【实验目的】理解Socket的基本概念工作原理,掌握Socket的建立、监听、连接、发送数据和接收数据。

【实验内容】采用Java(c++或者c语言)语言编写网络上的点对点的Socket程序。

该程序必须能在服务器端实现监听连接请求,客户端实现发送连接请求的功能,在建立连接后进行发送和接收数据的功能。

【实验要求】实验课时为4学时。

要求完成在服务器端和客户端的源程序的编写,并作出分析。

具体要求如下:1、服务器端建立一个Socket,设置好本机的IP和监听的端口与Socket进行绑定,开始监听连接请求,当接收到连接请求后,发出确认,同客户端建立连接,开始与客户端进行通信。

2、客户端建立一个Socket,设置好服务器端的IP和提供服务的端口,发出连接请求,在收到服务器的确认后,建立连接,开始与服务器端进行通信。

3、服务器端和客户端的连接及它们之间的数据传送均采用同步方式。

【基本概念】网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向连路的一端成为一个Socket。

Socket通常用来实现客户方和服务方的连接。

它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。

在Java等语言中,有专门的Socket类来处理用户的请求和响应。

利用Socket类的方法,就可以实现两台计算机之间的通讯。

【演示界面】主界面注册界面【总结感悟】用到了java语言已经提供好的socket类进行调用,这在很大程度上方便了我们的操作,遇上的问题是注册在文件里面和登陆的时候从文件里面调取。

还有多道线程方面的处理问题。

以及界面等方面的内容,当然,设计到的专业知识是tcp 方面的,也就是面向连接的,也可以用udp来进行通信。

socket实验报告

socket实验报告

socket实验报告Socket实验报告简介Socket是计算机网络中一种常用的通信方式,它提供了一种用于网络通信的编程接口。

本实验旨在通过使用Socket编程实现简单的客户端和服务器之间的通信,探索Socket的基本原理和使用方法。

实验目的1. 理解Socket的概念和原理;2. 掌握Socket编程的基本步骤和方法;3. 实现一个简单的客户端和服务器之间的通信。

实验过程1. Socket的概念和原理Socket是一种抽象层,它将底层的网络通信细节封装起来,提供了一种简单、统一的编程接口。

通过Socket,应用程序可以通过网络进行数据传输,实现不同主机之间的通信。

2. Socket编程的基本步骤a. 创建Socket对象:在客户端和服务器端分别创建Socket对象,用于建立通信连接。

b. 建立连接:客户端通过Socket对象连接到服务器端,建立起通信通道。

c. 数据传输:通过Socket对象进行数据的发送和接收。

d. 关闭连接:通信结束后,关闭Socket连接。

3. 实现一个简单的客户端和服务器之间的通信a. 客户端代码:```pythonimport socketdef main():# 创建Socket对象client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接server_address = ('localhost', 8888)client_socket.connect(server_address)# 发送数据message = 'Hello, server!'client_socket.sendall(message.encode())# 接收数据data = client_socket.recv(1024)print('Received:', data.decode())# 关闭连接client_socket.close()if __name__ == '__main__':main()```b. 服务器端代码:```pythonimport socketdef main():# 创建Socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口server_address = ('localhost', 8888)server_socket.bind(server_address)# 监听连接server_socket.listen(1)print('Waiting for client connection...')while True:# 建立连接client_socket, client_address = server_socket.accept()print('Connected by', client_address)# 接收数据data = client_socket.recv(1024)print('Received:', data.decode())# 发送数据message = 'Hello, client!'client_socket.sendall(message.encode())# 关闭连接client_socket.close()if __name__ == '__main__':main()```实验结果通过运行客户端和服务器端的代码,可以实现客户端向服务器发送消息,并接收服务器返回的消息。

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

《计算机操作系统》实验报告实验七:Linux Socket编程学校:╳╳╳院系:╳╳╳班级:╳╳╳姓名:╳╳╳学号:╳╳╳指导教师:╳╳╳目录一、实验题目 (3)二、实验学时 (3)三、指导老师 (3)四、实验日期 (3)五、实验目的 (3)六、实验原理 (3)6.1 什么是Socket (3)6.2 Socket建立 (3)6.3 Socket配置 (4)6.4 连接建立 (5)6.5 数据传输 (6)6.6 结束传输 (7)七、实验步骤及结果 (7)7.1 编译服务端(server.c) (7)7.2 编译客户端(client.c) (8)7.3 服务端与客户端交互 (8)八、报告书写人 (9)附录一服务端(server.c) (9)附录二客户端(client.c) (11)实验七:Linux Socket编程一、实验题目Linux Socket编程二、实验学时3学时三、指导老师╳╳╳四、实验日期2018年12月17日星期一五、实验目的(1)了解socket含义(2)设计socket程序,实现远程服务器端和客户端的通信六、实验原理6.1 什么是SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。

要学Internet上的TCP/IP 网络编程,必须理解Socket接口。

Socket接口设计者最先是将接口放在Unix操作系统里面的。

如果了解Unix 系统的输入和输出的话,就很容易了解Socket了。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。

Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

6.2 Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。

socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP 协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket 接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0"。

Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。

Socket执行体为你管理描述符表。

两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。

Socket数据结构中包含这五种信息。

6.3 Socket配置通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。

面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。

无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。

Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。

Bind函数原型为:int bind(int sockfd,struct sockaddr *my_addr, int addrlen);Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。

struct sockaddr结构类型是用来保存socket信息的:struct sockaddr {unsigned short sa_family; /* 地址族, AF_xxx */char sa_data[14]; /* 14 字节的协议地址 */};sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。

另外还有一种结构类型:struct sockaddr_in {short int sin_family; /* 地址族 */unsigned short int sin_port; /* 端口号 */struct in_addr sin_addr; /* IP地址 */unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */};这个结构更方便使用。

sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。

指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。

同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。

注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序;而sin_addr则不需要转换。

计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。

Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。

下面是几个字节顺序转换函数:·htonl():把32位值从主机字节序转换成网络字节序·htons():把16位值从主机字节序转换成网络字节序·ntohl():把32位值从网络字节序转换成主机字节序·ntohs():把16位值从网络字节序转换成主机字节序Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。

需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。

6.4 连接建立面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:int connect(int sockfd, struct sockaddr *serv_addr,int addrlen); Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。

Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。

进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到打断口。

Connect函数启动和远端主机的直接连接。

只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。

无连接协议从不建立直接连接。

面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。

Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。

int listen(int sockfd, int backlog);Sockfd是Socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们(参考下文)。

Backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。

如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。

当出现错误时listen函数返回-1,并置相应的errno错误码。

accept()函数让服务器接收客户的连接请求。

在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。

int accept(int sockfd, void *addr, int *addrlen);sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。

出现错误时accept函数返回-1并置相应的errno值。

首先,当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的 socket上监听,同时可以在新的socket描述符上进行数据传输操作。

6.5 数据传输Send()和recv()这两个函数用于面向连接的socket上进行数据传输。

Send()函数原型为:int send(int sockfd, const void *msg, int len, int flags);Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。

相关文档
最新文档