stcp client与server简单通信实验报告
简单TCP通信程序设计实验报告

简单TCP通信程序设计实验报告学校:华中科技大学学院:姓名:学号:同组人:一,实验目的初步掌握C++ 语言TCP/IP 通信程序的设计。
二,实验环境1、Windows 7 操作系统。
2、编程工具:Visual Studio 2010。
三,实验框图WinSock 通过流式套接字(SOCK_STREAM)提供TCP 服务。
通常服务器进程先启动,等待客户端的连接请求。
其基基通信过程如下图1所示。
四,实验内容与步骤(server)1,加载WinSock动态链接库函数原型:intWSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);程序代码://加载WinSock.DllWSADATA wsaData;WORD wVersionRequested = MAKEWORD(2, 2);if (WSAStartup(wVersionRequested, &wsaData) != 0){// WinSock 初始化错误处理代码}2,创建套接字创建套接字的实质是请求操作系统分配通信所需要的资源(包括存储空间、网络资源、CPU 时间等),用一个称为套接字描述符(socket descriptor)的整数表示。
函数原型:SOCKET socket(intaf, int type, int protocol);程序代码://创建套接字SOCKET sock_client;if ((sock_client= socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){cout<<"创建套接字失败!错误代码:"<<WSAGetLastError() <<endl;WSACleanup();return 1;}3,建立连接客户端则在创建套接字后,调用connect 函数发起连接建立请求。
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;}。
简单Web Server实现、电子邮件客户端实验报告

一.简单Web Server实现1.引言1.1实验目的通过本实验,熟悉Web Server的安装和配置过程,进一步理解其工作原理。
1.2 介绍WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。
WWW 是Internet 的多媒体信息查询工具,是Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。
正是因为有了WWW工具,才使得近年来Internet 迅速发展,且用户数量飞速增长。
2.任务概述2.1实验目标实现一个Web Server的基本功能,用户通过Chrome等浏览器向服务器端发出网页请求,服务器端接到请求,向用户返回用户所需的网页。
同时通信记录在服务器端记录现实。
2.2运行环境需求Win7,cmd。
3.工作原理http协议使Web服务器和浏览器可以通过Web交换数据。
它是一种请求/响应协议,即服务器等待并响应客户方请求。
H T T P不维护与客户方的连接,它使用可靠的T C P连接。
客户/服务器传输过程可分为四个基一步骤:1 浏览器与服务器建立连接;2 浏览器向服务器请求文档;3 服务器响应浏览器请求;4 断开连接。
4. 程序演示1、运行程序WebServer.java图1:运行WebServer.java效果2、访问服务器URL:http://localhost:8080/图2:访问服务器URL:http://localhost:8080/效果3、服务器端:图3:用户访问之后服务器端效果5. 程序代码://WebServer.java WebServer是服务器主线程类import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .ServerSocket;import .Socket;public class WebServer {//设置静态资源的目录public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator;//设置关闭命令private static final String SHUTDOWN_COMMAND="/SHUTDOWN";private boolean shutdown=false;public static void main(String[] args) {WebServer server=new WebServer();server.await();}public void await() {ServerSocket serverSocket=null;//监听8080端口int port=8080;try {serverSocket=new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));} catch (IOException e) {e.printStackTrace();System.exit(1);}//循环等待客户端连接while (!shutdown) {Socket socket=null;InputStream inputStream=null;OutputStream outputStream=null;System.out.println("Web Server is listening on port "+serverSocket.getLocalPort());try {socket=serverSocket.accept();//当有客户端连接时inputStream=socket.getInputStream();//获取请求字符流outputStream=socket.getOutputStream();//输出流//处理客户端请求---RequestRequest request=new Request(inputStream);request.parse();//向客户端发送ResponseResponse response=new Response(outputStream);response.setRequest(request);response.sendStaticResource();//关闭socketsocket.close();//检查如果是shutdown命令,关闭服务器shutdown=request.getUri().equals(SHUTDOWN_COMMAND);} catch (Exception e) {e.printStackTrace();continue;}}}}//Request.java 响应HTTP协议中的Requestimport java.io.IOException;import java.io.InputStream;public class Request {private InputStream inputStream;private String uri;public String getUri() {return uri;}public void setUri(String uri) {this.uri = uri;}public Request(InputStream inputStream) {this.inputStream=inputStream;}public void parse() {//从socket读取字符StringBuffer request=new StringBuffer(2048);int i;byte[] buffer=new byte[2048];try {i=inputStream.read(buffer);} catch (IOException e) {e.printStackTrace();i=-1;}for (int j = 0; j < i; j++) {request.append((char)buffer[j]);}System.out.println(request.toString());uri=parseUri(request.toString());}/*** 从客户端请求字符串中截取请求资源uri* @param requeString 请求字符串,包括请求头、请求方法、请求资源的uri * @return 请求资源的uri*/private String parseUri(String requeString){int index1,index2;//比如GET /index.html HTTP/1.1//请求方法、请求资源、版本之间以空格隔开index1=requeString.indexOf(' ');if (index1!=-1) {index2=requeString.indexOf(' ', index1+1);if (index2>index1) {return requeString.substring(index1+1, index2);}}return null;}}//Response.java 响应HTTP协议中的Responseimport java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;public class Response {private static final int BUFFER_SIZE=1024;Request request;OutputStream outputStream;public Response(OutputStream outputStream) {this.outputStream=outputStream;}public void setRequest(Request request) {this.request=request;}//发送静态资源public void sendStaticResource() throws IOException {byte[] bytes=new byte[BUFFER_SIZE];FileInputStream fis=null;try {File file=new File(WebServer.WEB_ROOT, request.getUri()); if (file.exists()) {//如果请求的静态资源文件存在fis=new FileInputStream(file);int ch=fis.read(bytes, 0, BUFFER_SIZE);while (ch!=-1) {outputStream.write(bytes, 0, ch);ch=fis.read(bytes, 0, BUFFER_SIZE);}}else {//如果静态资源不存在String errorMessage="HTTP/1.1 404 File Not Found\r\n"+ "Content-Type:test/html\r\n"+"Content-Length:23\r\n"+"\r\n"+"<h1>File Not Found</h1>";outputStream.write(errorMessage.getBytes());}} catch (Exception e) {System.out.println(e.toString());}finally{if (fis!=null) {fis.close();}}}}6. 实验心得:通过本次实验,我锻炼了自己的上机操作能力,并对理论知识有了进一步的理解,了解并掌握了简单WebServer的安装与配置过程,并对客户服务器模式的内部运行有了进一步的理解。
TCP服务器与客户端软件(word文档良心出品)

学院:信电学院班级:电信102 姓名:公维蒙学号:2010081266 课程:应用软件综合实验实验日期:2013年12月日成绩:1 实验目的1.理解和掌握软件工程的设计理念与设计方法。
2.掌握某种数据库管理以及可视化编程环境,掌握基于某种编程语言的信息系统或网络通信软件或某种通用总线接口的通信软件的开发设计方法。
2 实验题目及要求题目:TCP服务器与客户端软件本题目要求使用TCP协议实现若干台电脑之间的通信。
1.任何一台电脑都具有收发信息功能。
2.具有记录查询通信纪录的功能。
3.有图形化界面。
4. 服务器可同时与多个客户端通信。
分别实现服务器和客户端的程序。
学院:信电学院班级:电信102 姓名:公维蒙学号:2010081266课程:应用软件综合实验实验日期:2013年12月日成绩:3 实验系统设计3.1 需求分析:本次实验的题目是TCP服务器与客户端软件,本题目要求使用TCP协议实现若干台电脑之间的通信。
软件针对局域网内部用户,实现用户间的即时通信。
需要分别实现服务器端和客户端的软件设计,并有图形化界面。
服务器端负责监听用户连接请求,负责连接数据库存储用户信息,负责发送给用户好友信息,负责发送心跳报文检查用户在线状态并即时让用户更新好友在新信息。
客户端发起主动连接,向服务器请求登录或者注册。
客户端可以修改昵称,可以加已知用户为好友(类似于MSN的好友添加功能)。
客户端之间可以发起P2P模式的聊天,可以传送文件。
3.2 主要理论依据:1.TCP——传输控制协议:TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。
TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。
TCP要求在发送数据之前必须打开连接。
服务器应用程序必须执行一个称作被动打开(passive open)的操作,以利用一个已知的端口号创建一个链接,这是,服务器并不是对网络进行呼叫,而是侦听并等待引入的请求。
实验4-进程间通信―共享存储区的创建、附接和断接

操作系统实验报告课程名称:操作系统开课学期:班级:指导老师:实验题目:共享存储区的创建、附接和断接学号:姓名:提交时间:一、实验目的和要求了解和熟悉共享存储机制二、实验内容编制一长度为1k的共享存储区发送和接收的程序。
程序设计(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
(2)SERVER端建立一个key为75的共享区,并将第一个字节设置为-1,。
作为数据空的标志。
等待其他进程发来的消息。
当字节的值发生变化时,表示收到了信息,进行处理。
然后再次把它的值设为-1。
如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。
SERVER每接收到一个数据后显示“(server)receive”。
(3)CLIENT端建立一个key 为75的共享区,当共享取得第一个字节为-1时,Server端空闲,可发送请求。
CLIENT随即填入9到0。
期间等待server 端的再次空闲。
进行完这些操作后,CLIENT退出。
CLIENT每发出一次数据后显示“(client)sent”。
(4)父进程在SERVER和CLIENT均退出后结束。
三、实验运行结果1.涉及的系统调用(1)shmget( )创建、获得一个共享存储区。
系统调用格式:shmid=shmget(key,size,flag)(2)、shmat( )共享存储区的附接。
从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。
系统调用格式:virtaddr=shmat(shmid,addr,flag)(3)3、shmdt( )把一个共享存储区从指定进程的虚地址空间断开。
系统调用格式:shmdt(addr)(4)、shmctl( )共享存储区的控制,对其状态信息进行读取和修改。
系统调用格式:shmctl(shmid,cmd,buf)2.实验源代码:3.实验运行过程:。
sctp传输层协议

竭诚为您提供优质文档/双击可除sctp传输层协议篇一:tcp与sctp—cmt分析及在无线网络应用比较龙源期刊网.cntcp与sctp—cmt分析及在无线网络应用比较作者:翁慧敏黄明和汪浩许长桥刘凯来源:《电脑知识与技术》20xx年第27期摘要:tcp协议与sctp协议同属于传输层协议,都可以提供可靠的数据传输服务。
sctp-cmt是在sctp协议的基础上提出的并行多路径传输机制,可以同时利用多条路径进行数据传输以提高链路的利用率,该文对tcp和sctp-cmt的基本特性进行了简述。
为比较tcp与sctp-cmt在具有多种接入方式的无线网络中的传输性能,该文以车载网络环境为例,并在ns2仿真工具下对tcp与sctp-cmt在车载网络环境中的传输效率进行仿真比较,仿真结果显示,sctp-cmt的传输性能始终高于tcp。
关键词:tcp协议;sctp协议;并行多路径传输;无线网络;车载网络中图分类号:tp393文献标识码:a文章编号:1009-3044(20xx)27-6091-03当前网络中广泛使用的传输层协议是tcp和udp协议,tcp与udp的显著区别是tcp可以提供可靠的数据传输服务,这使它在网络应用中有着杰出的贡献,然而随着网络技术的提高,tcp的局限性也越来越明显。
sctp协议(流控制传输协议)是2000年提出的新一代传输层协议,它具有与传统tcp和udp协议不同的多宿性和多流性,不仅可以提供可靠的数据传输服务还具有选择性重传、无序递交等特性[1]。
为充分利用每条路径资源以提高网络传输速率,iyengar博士等人在sctp基础上提出了并行多路径传输(concurrentmultipathtransfer)机制,在近年来受到了更多的关注,并已逐渐成为研究的热点,该文对tcp及sctp-cmt的基本特性进行了介绍。
随着无线网络的发展以及接入方式的多样化,无线网络通信受到了越来越多的关注,尤其是具有多种接入方式的无线网络通信,而车载网络属于高速移动的无线网络,且随着汽车的日益普及,对车载网络的研究具有一定的意义,基于以上几点,该文以车载网络为例来研究tcp和sctp-cmt在具有多种接入方式的无线网络中的传输性能,并在ns2仿真平台上对tcp与sctp-cmt在车载网络环境中的性能进行了仿真分析比较。
简单的客户端、服务器程序教学文稿

简单的客户端、服务器程序洛阳理工学院实验报告1、 熟悉 Microsoft Visual Studio 2008 编程环境。
2、 了解TCP 与UDP 协议,以及它们之间的区别。
3、 了解客户/服务器模型原理。
4、熟悉Socket 编程原理,掌握简单的套接字编程。
实验条件:硬件:PC 机(两台以上)、网卡、已经设定好的以太网环境 软件:Microsoft Visual Studio 2008实验内容:1、编写用TCP 协议实现的Client 端和Server 端程序并调试通过 程序分两部分:客户程序和服务器程序。
工作过程是:服务器首先启动,它创建套接字之后等待客户的连接;客户启动后创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将 数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来。
或 者服务器接收键盘输入,然后将数据发送到客户机,客户机收到数据后,将接收到 的字符在屏幕上显示出来。
程序流程如下:服务器连接建立,accept(返回,得到新的套接 ---------------- >recvt()/send()在套接字sc 上读/写数据,2、编写用UDP 协议实现的Client 端和Server 端程序并调试通过(做完第一个实验 的基础上做该实验)3、编写用TCP 协议实现Client 端与Server 端的一段对话程序。
Server 端根据用户的 输入来提示Client 端下一步将要进行操作。
所用函数及结构体参考:1、创建套接字 ------ socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af, int type, int procotol);服务器Socket()建立流式套接字,返回套接字bin d(),套接字 s 与本地地址相连recvt()/send()在套接字上读/写数据,直closesocket()关闭套接字客户方7、关闭套接字 ----- closesocket()功能:关闭套接字s格式:BOOL PASCAL FAR closesocket (SOCKET s);8、WSADATA 类型和 LPWSADATA 类型WSADATA 类型是一个结构,描述了 Socket 库的一些相关信息,其结构定义如下:typedef struct WSAData {WORD wVersio n; WORD wHighVersio n; char szDescriptio n[ WSADESCRIPTION_LEN+1];szSystemStatus[WSASYS_STATUS_LEN+1]; iMaxSockets; iMaxUdpDg; IpVe ndorl nfo; typedef WSADATA FAR *LPWSADATA; 值得注意的就是wVersion 字段,存储了 Socket 的版本类型。
(完整word版)实验七简单的服务器、客户端程序实验报告

Client:
*
1.Send
Message
*
2.Receive Message
*
3.Exit
Enter your choice:");
gets(Msg); Msg[10239]='\0'; ::send(sock1,Msg,strlen(Msg),0);
} //消息接收函数 void Recect(sock1,(LPSOCKADDR)&my_addr,sin_size))==-1)
{
perror("Accepting stream socket");
exit(1);
}
}
6 / 10
//选择菜单 int menu() {
char *s=(char*)malloc(2*sizeof(char));
char *s=(char*)malloc(2*sizeof(char));
int c; printf("\n\n\n printf(" printf(" printf(" printf(" printf(" do {
printf("\n gets(s); if(s[0]=='\0'){
gets(s); } c=atoi(s); }while(c<0||c>3); free(s); return c;
} //主函数 void main() {
Init(); for(;;) {
switch(menu()) { case 1:
Send(); break; case 2: Receive(); break; case 3: exit(0); } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四:实现SCTP client/server 之间数据传输
一.实验要求与目的
实现client和server建立关联。
通过client和server建立关联便于更好的了解sctp协议。
实现client和server之间数据传输。
实现数据传输也就是实现client和server 之间的通信,通过编写程序实现通信可以更好地了解sctp server和client通信四次握手的过程。
二.实验原理
SCTP(STREAM CONTROL TRANSMISSION PROTOCOL 流控制传输协议)是IETF新定义的一个传输层transport layer协议(2000年)。
是提供基于不可靠传输业务的协议之上的可靠的数据报传输协议。
SCTP的设计用于通过IP 网传输SCN窄带信令消息。
流控制传输协(Stream Control Transmission Protocol,SCTP)是一种可靠的传输协议,它在两个端点之间提供稳定、有序的数据传递服务,并且可以保护数据消息边界。
然而,与TCP 和UDP 不同,SCTP 是通过多宿主(Multi-homing)和多流(Multi-streaming)功能提供这些收益的,这两种功能均可提高可用性SCTP实际上是一个面向连接的协议,但SCTP偶联的概念要比TCP的连接具有更广的概念,SCTP对TCP的缺陷进行了一些完善,使得信令传输具有更高的可靠性,SCTP的设计包括适当的拥塞控制、防止泛滥和伪装攻击、更优的实时性能和多归属性支持。
SCTP 提供如下服务:
* 确认用户数据的无错误和无复制传输;
* 数据分段以符合发现路径最大传输单元的大小;
* 在多数据流中用户信息的有序发送,带有一个选项,用户信息可以按到达顺序发送;
* 选择性的将多个用户信息绑定到单个SCTP 包;
* 通过关联的一个终端或两个终端多重宿主支持来为网络故障规定容度。
SCTP是在IP网络上使用的一种可靠的通用传输层协议。
Internet协议套件被划分成几层;每层都提供特定功能,如图 1 所示。
图1 IP堆栈的层次化结构
SCTP中对新连接的初始化是通过报文握手来完成的。
SCTP中,这种机制称为四次握手。
如图2所示:
图2 SCTP 握手使用的报文交换
SCTP是基于连接的协议,它需要在对等的两端建立和拆除连接。
SCTP连接结束序列如图3所示:
图3 SCTP连接结束序列
三.程序实现
程序实现的流程图如图4所示:
Server Client
scoket
bind
listen
accept Sctp_sendmsg Sctp_sendmsg
close
scoket
accept Sctp_sendmsg Sctp_sendmsg
close
图4 代码实现流程图
具体代码实现如下:
server首先创建服务器的套接字。
然后创建一个sockaddr结构,指定这个连接可以从任何本地接口上创建(使用通配符地址INADDR_ANY)。
使用
bind 调用将这个sockaddr 结构绑定到socket上,然后将服务器套接字设置成监听状态。
现在就可以接收到达的连接了。
在从accept 函数返回时,会使用connSock socket 标识新客户机的连接。
采用message2和message2数组来存储字符串。
使用sctp_sendmsg 函数,将这个字符串发送给client。
在client中,首先创建了一个SCTP 套接字,然后创建了一个sockaddr 结构,其中包含了将要连接的端点。
connect函数然后建立一个到服务器的连接。
要获取消息的流编号,SCTP需要启用套接字选项sctp_data_io_event。
通过启
用这个选项,就可以通过sctp_recvmsg 函数接收一条消息.
四.实验结果
本次实验所得结果如图5所示:
在linux终端下运行c代码,先运行sctpsrvr.c程序,可以看到终端显示”waiting for a new client connection...”,然后在在ubuntu下新开启一个终端,运行sctpclnt.c程序,则server端显示连接成功,并发送数据给client,client端显示server所发送的数据。
图5 sctp 协议下server 和client 通信程序结果显示。