socket通信范文

时间:2023-12-02 15:01:33

socket通信

socket通信篇1

【关键词】Socket通信 无线 视频传输

在网络时代,网络通信贯穿于人们生活的方方面面。网络通讯工具的实现、浏览器的进程与web服务器的通信等等,均离不开Socket。Socket一词最早起源于Stephen Carr在1970年2月发表的论文,它通常被翻译为套接字,是存在于应用层和传输层之间的一个抽象层。服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

1 Socket通信流程

Socket是“打开―读/写―关闭”模式的实现,其通信流程如下:

(1)服务器根据地址类型(ipv4,ipv6)、Socket类型,协议创建Socket;

(2)服务器为Socket绑定IP地址和端口号;

(3)服务器Socket监听端口号请求,随时准备接收客户端发来的连接,这时服务器的Socket并没有被打开;

(4)客户端创建Socket;

(5)客户端打Socket,根据服务器IP地址和端口号试图连接服务器Socket;

(6)服务器Socket接收到客户端Socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时Socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求;

(7)客户端连接成功,向服务器发送连接状态信息;

(8)服务器accept方法返回,连接成功;

(9)客户端向Socket写入信息;

(10)服务器读取信息;

(11)客户端关闭;

(12)服务器端关闭。

2 建立Socket通信

Socket主要由客户端和服务端两部分构成,通过服务端与客户端建立通信后,由服务端向客户端发送相关的指令。

(1)在服务端,首先需要申请一个Socket,然后把它绑定到一个IP地址和一个端口,开启监听,等待客户端发来的接收连接。

(2)在客户端,也需应该申请一个Socket,然后连接到服务器的指定IP和端口。

(3)服务器端接收到连接请求后,产生一个新的Socket(端口大于1024)与客户端建立连接并进行通信,原监听Socket继续监听。

(4)需要注意一点的是负责通信的Socket是不能无限创建的,创建的数量和操作系统是有关系的。

3 基于Socket的无线视频传输

利用Socket和WiFi技术进行视频传输,需将捕获到的每帧图像进行转码,转成适合Socket传输的byte数组的形式,然后通过Socket通信,在客户端接收从服务端传送过来的视频,并进行实时显示。

(1)在服务端通过调用Marshal类的成员copy函数,把Image类型的图片的尺寸转换到byte数组中,然后发送通过Socket传输发送byte数组到客户端,这部分C#指令如下:

MIplImage mi = image.MIplImage;

byte[] buffer = new byte[mi.imageSize]; //dwBufSize数据长度

Marshal.Copy(mi.imageData, buffer, 0, mi.imageSize); //pBuffer IntPtr类型

Senddata(buffer); //发送图片数据

(2)在客户端通过Socket传输接收到来自服务端的数组byte数组,并通过格式转换,提取数据,还原成imageBox控件能够显示的Image类型,然后就能偶在客户端显示服务端接收到视频了。相关的格式转换代码如下:

//byte数组到IntPtr类型转换

IntPtr imgb =CvInvoke.cvCreateImageHeader(sz, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);

GCHandle pinnedArray = GCHandle.Alloc(MsgBuffer, GCHandleType.Pinned);

IntPtr pointer = pinnedArray.AddrOfPinnedObject();

CvInvoke.cvSetData(imgb, pointer, 1920);

pinnedArray.Free();

// IntPtr到IntPtr类型转换

Image image = new Image(sz);

CvInvoke.cvCopy(imgb, image.Ptr, IntPtr.Zero);

disImageBox.Image=image;

(3)调试成功后,打开服务端和客户端的运行程序,然后,点击服务端的Start Server按键,开启服务,在客户端点击点击连接,使服务端与客户端建立通信,然后在服务端点击Start Capture后,服务端会接收到本地摄像头的视频,客户端接收的画面与服务端一致,视频传输完成。

参考文献

[1]高伟,詹胜.基于Socket接口网络通信的实现[J].唐山师范学院学报,2008(05):19-20.

[2]张海深.关于视频编码压缩技术的探讨[J].数字技术与应用,2013(02):12-14.

作者简介

雷阳(1984-),男。博士学位。现为福建省计量科学研究院工程师。主要研究方向为流量计量测试技术及自动控制。

作者单位

1.福建省计量科学研究院 福建省福州市 350003

2.国家蒸汽流量计产品质量监督检验中心 福建省福州市 350003

socket通信篇2

南京河海大学计算机及信息工程学院 朱泾文

摘要: 本文讲述用SOCKET接口编程的原理及使用它实现交易系统的具体方法。

关键词:SOCKET 通信 交易

1.交易系统介绍

交易就是用户对商品的买与卖。交易系统是通过计算机系统来进行交易,也就是说,商品的买与卖都是通过计算机的网络及后台进程配对完成,交易核心采用基于内存的方式设计开发以达到最大的交易及查询响应速度。它的设计思路是:交易系统的所有数据存放在关系数据库中,但交易核心在启动后与硬盘数据不直接通信,而只是在启动时将交易所需数据一次性读入共享内存。这之后的所有交易撮合、生成委托单、交易结果都是在内存中实现的。当交易结束后,再将交易结果从内存装回硬盘数据库中,在数据库中实现交易结算、整理,产生各种帐目及统计报表,同时,再一次完成各种信息的录入与修改。

交易核心与外界的通信经由消息队列(MESSAGE QUEUE),交易核心用于交易所使用的数据存放共享内存(SHARED MEMORY)中,利用SOCKET接口编程来实现.

2.SOCKET的设计原理及进行通信连接的过程框图

Socket设计在操作系统的核心中,提供一些系统调用以支持多种通信协议(如TCP,UDP等等)。当要支持一种新的通信协议时,则需要把核心做一些改变。为了免除改变核心太多而造成不便,可以采用流的模块方式来添加新的功能,但这种方式并无法完全免除更动核心的操作。实际上,核心的设计把网络系统分成三个不同的层,如下图。

Socket支持3种访问传输系统的接口:其中一种就是同步阻塞方式:使用同步阻塞方式时,Socket库函数暂停程序的运行,等待传输系统完成请求的操作,操作一旦完成,应用程序重新获得控制权。如下右图。

3.重要的Socket系统调用

(1)创建socket- sockets()系统调用

应用程序在使用sockets之前,首先必须拥有一个sockets,系统调用sockets()向应用程序提供创建sockets的手段,其调用格式如下:

sockid = socket (int af, int type, int protocol);

(2)指定本地地址-bind()系统调用

在创建了一个新的socket号后,还要用bind()将本地socket地址(包括主机地址和本地端口号)与所创建的socket号联系起来,其调用格式如下:

bind (SOCKET sockid, const struct sockaddr FAR* name, int namelen);

(3)listen()系统调用

该调用用于面向连接的流socket,表明它愿意接收连接请求。当服务器可能同时收到几个连接请求时,便将连接请求放入请求队列。Listen()在accept()之前调用,其格式为:

listen(SOCKET sockid, int backlog);

(4)建立socket 连接connect()与accept()系统调用

用于完成整个关联的建立。connect()的调用格式如下:

connect (SOCKET sockid, const struct sickaddr FAR*name, int namelen);

(5)发送数据send()和sendto()系统调用

建立了socket连接后,便可利用上述函数通过该socket发送数据。其中send()用于面向连接的传输,sendto()用于无连接传输,调用格式如下:

send (SOCKET sockid, char FAAR* buf, intbuflen, int flags);

sendto(SOCKET sockid, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen);

(6)接收数据—recv()和recvfrom()系统调用接收数据系统调用与发送数据系统调用是一对应的,其调用格式也是一一对应。

(7)关闭socket—closesocket()系统调用

在完成数据传输任务后,需要调用closesocket()来关闭连接和释放socket,其调用格式如下:

socket通信篇3

[关键词]Winsock Csocket TCP/IP

[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0075-02

前言

为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套Windows下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。

微软为VC定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,读者可以使用这些类来实现自己的网络程序,为了更好的了解Winsock API编程技术,这里将探讨怎样使用底层的API函数实现简单的Winsock 网络应用程序设计,分别说明如何在Server端和Client端操作Socket,实现基于TCP/IP的数据传送,并给出相关的源代码。

1 Winsock API编程

在VC中进行Winsock的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。

(1)WINSOCK.H。这是WINSOCK API的头文件,需要包含在项目中。

(2)WSOCK32.LIB。WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。

(3)WINSOCK.DLL。WINSOCK的动态连接库,位于WINDOWS的安装目录下。

1.1 服务器端操作 socket(套接字)

1.1.1 在初始化阶段调用WSAStartup()

此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程序中调用该函数的形式如下:WSAStartup((WORD)((1

1.1.2 建立Socket

初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket 的函数都可以使用这个函数来获取失败的原因)。函数原型为:

SOCKET PASCAL FAR socket( int af, int type, int protocol )

参数:af

目前只提供 PF_INET(AF_INET);

type

Socket 的类型 (SOCK_STREAM、SOCK_DGRAM);

protocol 通讯协定(如果使用者不指定则设为0);

如果要建立的是遵从TCP/IP协议的socket,第二个参数type应为SOCK_STREAM,如为UDP(数据报)的socket,应为SOCK_DGRAM。

1.1.3 绑定端口

接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。函数原型为:

int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen);

参数:s

Socket对象名;

name

Socket的地址值,这个地址必须是执行这个程序所在机器的IP地址;

namelen name的长度;

如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。

1.1.4 监听

当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket进入监听状态,并设定可以建立的最大连接数(目前最大值限制为5,最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。

函数原型为:

int PASCAL FAR listen( SOCKET s, int backlog );

参数:s

需要建立监听的Socket;

backlog 最大连接个数;

服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。函数原型为:

int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );

参数: s

Socket 对象;

hWnd

接收消息的窗口句柄;

wMsg

传给窗口的消息;

lEvent

被注册的网络事件;

lEvent也就是应用程序向窗口发送消息的网路事件,该值可以是下列各值的组合,各值的具体含意如表1。

具体应用时,wMsg应是在应用程序中定义的消息名称,而消息结构中的lParam则为以上各种网络事件名称。所以,可以在窗口处理自定义消息函数中使用以下结构来响应Socket的不同事件:

switch(lParam) {

case FD_READ:

break;

case FD_WRITE、

break;

}

1.1.5 服务器端接受客户端的连接请求

当Client提出连接请求时,Server 端hwnd视窗会收到Winsock Stack送来的消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。函数原型为:

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );

参数:s

Socket的识别码;

addr

存放来连接的客户端的地址;

addrlen

addr的长度

1.1.6 结束 socket 连接

结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()函数相对应,程序结束前,需要调用 WSACleanup() 来通知Winsock Stack释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。函数原型为:

int PASCAL FAR closesocket( SOCKET s );

参数:s

Socket 的识别码;

int PASCAL FAR WSACleanup( void );

参数:无

1.2 客户端Socket的操作

1.2.1 建立客户端的Socket

客户端应用程序首先也是调用WSAStartup() 函数来与Winsock的动态连接库建立关系,然后同样调用socket() 来建立一个TCP或UDP socket(相同协定的sockets才能相通,TCP对TCP,UDP对UDP)。与服务器端的socket不同的是,客户端的socket可以调用 bind() 函数,由自己来指定IP地址及port号码;但是也可以不调用bind(),而由Winsock来自动设定IP地址及port号码。

1.2.2 提出连接申请

客户端的Socket使用connect()函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。函数原型为:

int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR *name, int namelen);

参数:s

Socket 的识别码;

name

Socket想要连接的对方地址;

namelen name的长度

1.3 数据的传送

虽然基于TCP/IP连接协议(流套接字)的服务是设计客户机/服务器应用程序时的主流标准,但有些服务也是可以通过无连接协议(数据报套接字)提供的。先介绍一下TCP socket 与UDP socket 在传送数据时的特性:Stream (TCP) Socket提供双向、可靠、有次序、不重复的资料传送。Datagram (UDP) Socket 虽然提供双向的通信,但没有可靠、有次序、不重复的保证,所以UDP传送数据可能会收到无次序、重复的资料,甚至资料在传输过程中出现遗漏。由于UDP Socket在传送资料时,并不保证资料能完整地送达对方,所以绝大多数应用程序都是采用TCP处理Socket,以保证资料的正确性。一般情况下TCP Socket的数据发送和接收是调用send() 及recv() 这两个函数来达成,而UDP Socket则是用sendto() 及recvfrom() 这两个函数,这两个函数调用成功发挥发送或接收的资料的长度,否则返回SOCKET_ERROR。函数原型为:

int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags );

参数:s

Socket 的识别码

buf 存放要传送的资料的暂存区

len buf的长度

flags

此函数被调用的方式

对于Datagram Socket而言,若是datagram的大小超过限制,则将不会送出任何资料,并会传回错误值。对Stream Socket言,Blocking 模式下,若是传送系统内的储存空间不够存放这些要传送的资料,send()将会被block住,直到资料送完为止;如果该Socket被设定为 Non-Blocking 模式,那么将视目前的output buffer空间有多少,就送出多少资料,并不会被 block 住。flags 的值可设为 0 或 MSG_DONTROUTE及 MSG_OOB 的组合。

int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags );

参数:s

Socket 的识别码

buf 存放接收到的资料的暂存区

len buf的长度

flags

此函数被调用的方式

对Stream Socket 言,我们可以接收到目前input buffer内有效的资料,但其数量不超过len的大小。

2 自定义CMySocket类

根据上面的知识,我们可以自己定义一个简单的CMySocket类,限于篇幅,具体代码这里不再赘述,有兴趣的读者可以Email索要。

自定义了CMySocket类,接着就可以在程序的服务器和客户端分别定义CMySocket对象,建立连接,传送数据了。例如,为了在服务器和客户端发送数据,需要在服务器端定义两个CMySocket对象ServerSocket1和ServerSocket2,分别用于监听和连接,客户端定义一个CMySocket对象ClientSocket,用于发送或接收数据,如果建立的连接数大于一个,可以在服务器端再定义CMySocket对象,但要注意连接数不要大于五。

3 结语

由于Socket API函数还有许多,如获取远端服务器、本地客户机的IP地址、主机名等等,读者可以在此基础上对CMySocket补充完善,实现更多的功能。

[参考文献]

[1] Anthony Jones and Jim Ohlund,Network Programming for Microsoft Windows,Microsoft Press.

socket通信篇4

【关键词】UDP协议;ARM;X86;通讯;解决方案

随着人工智能的应用,ARM产品已经遍布到各个领域:工业控制、无线通讯领域、消费类电子产品、成像和安全产品,包括现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用,因此,ARM与其它平台之间通讯就显得尤为重要。

1.UDP协议本质

UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。

数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据工作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。

如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。其实在UDP协议中校验功能是可选的,如果将其关闭可以使系统的性能有所提升。这与TCP协议是不同的,后者要求必须具有校验值。

2.实现案例

实现案例如下:在触摸屏进行画图,使其在液晶屏上显示,同时通过网络传输数据,使其在计算机屏幕上显示,并由计算机控制清除液晶屏上的图形。

步骤如下:

(1)新建工程

void InitNetWork()//初始化网络

{

U32 ipaddr32,ipmaskaddr32,ipgateaddr32;

U8 *Mac;

ipaddr32=Get_ipaddr(); //获取IP地址

ipmaskaddr32=Get_maskaddr();//获取子网掩码

ipgateaddr32=Get_gwaddr(); //获取网关

Mac=Get_mac(); //获取网卡地址

NetPortChoose(0); //选择网口,必须在配置网络以前进行

initOSNet(ipaddr32, ipmaskaddr32, ipgateaddr32,Mac);//配置网络

OSTimeDly(1000);//任务挂起1秒

printk("init Ethernet and UDP is ok!\n");

}

(3)定义计算机端套接字,全局变量

(4)编写Main_Task任务及消息循环

主要负责响应触摸屏消息,在屏幕上画图,然后将数据传输到计算机上。

对触摸屏消息的处理和键盘消息类似,其消息类型pMsg->Message为OSM_TOUCH_SCREEN,消息参数pMsg->LParam中包含了触摸屏的动作信息,定义如下:

#define TCHSCR_ACTION_NULL 0

#define TCHSCR_ACTION_CLICK 1 //触摸屏单击

#define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击

#define TCHSCR_ACTION_DOWN 3 //触摸屏按下

#define TCHSCR_ACTION_UP 4 //触摸屏抬起

#define TCHSCR_ACTION_MOVE 5 //触摸屏移动

消息参数pMsg->WParam中则包含了触摸点的坐标信息,低16位是X坐标值,高16位是Y坐标值。这里当触摸屏产生“按下”动作后采用MoveTo()函数设置绘图起始点坐标,当产生“移动”动作后采用LineTo()函数绘制线段。

3.解决方案

3.1 建立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数据结构中包含这五种信息。

3.2 配置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常被设置为

3.3 建立连接

面向连接的客户程序使用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);

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

3.4 传输数据

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

Sockfd是你用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位数据的长度;flags一般情况下设置为0(关于该参数的用法可参照man手册)。

Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。

3.5 传输结束

当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作。

socket通信篇5

关键词:Linux;Windows;套接字;客户机/服务器

DOIDOI:10.11907/rjdk.151230

中图分类号:TP319

文献标识码:A 文章编号:16727800(2015)006009403

作者简介作者简介:陈洁(1990-),女,山东菏泽人, 山东科技大学信息科学与工程学院硕士研究生,研究方向为计算机网络应用技术;孟晓景(1962-),男,浙江绍兴人, 山东科技大学信息科学与工程学院教授,研究方向为计算机网络。

0 引言

Linux是一个基于POSIX和UNIX的多任务、多用户、支持多线程的操作系统。Linux在众多方面表现出强大的优势,通常用在控制领域以提高系统性能。然而,目前使用最多的Windows操作系统图形界面友好,拥有良好的集成开发环境,操作简单,深受广大用户的喜爱。两种操作系统各有千秋,越来越多场合同时使用,这就出现了跨平台的通信问题。对此,本文通过Socket套接口来实现不同操作系统之间的实时聊天,运用C/S模式设计出Windows与Linux操作系统间可以互相通信的网络聊天室,本客户端可以显示其它客户端的消息,实现了信息的及时共享。

1 Socket编程原理与过程

1.1 Socket编程原理

Socket[1]作为BSD UNIX的进程通信机制,通常也称作“套接字”,用于描述IP地址和端口,是网络通信的基本单元。基于TCP/IP协议的 Socket 编程是一种典型的会话编程方式,它既适用于客户/服务器通信方式,又适用于点对点通信方式。套接字通过调用系统提供的库函数实现数据传输,不需要过多了解底层的一些细节。本文采用C/S[2]通信方式编程。通信服务方式分为面向连接和无连接,这里使用的是面向连接的流套接字。

1.2 Socket编程过程

Socket编程过程分为客户端和服务器端编程,大致通信过程如图1所示。

Socket编程过程首先需要创建套接字socket(),然后服务器端绑定套接字bind(),即将本地主机IP地址、端口号与创建的套接字绑定。绑定完成后进入监听状态listen(),等待客户端连接。客户端如果发起连接connect(),服务器和客户端的底层就进行三次握手接受连接accept()。连接成功后,双方就可以收发数据了。在此连接上使用send()函数发送数据,在连接的另一端使用rev()函数接收数据,这样,Socket就连接了两端的应用程序。套接字机制提供了一系列的系统调用函数,通过这些函数调用,应用程序就可以在掩盖通信协议细节的情况下实现网络传输。

2 通信环境搭建

本系统是跨平台网络聊天室,Linux为服务器端,用于接收客户端请求,而客户端可以是Windows操作系统,也可以是Linux操作系统。为避免使用多个计算机的麻烦,本系统在一台计算机上安装虚拟机,虚拟机为Linux操作系统,另外一个是Win7操作系统,在进行编程之前,要先检验Win7操作系统与Linux操作系统是否可以正常进行网络通信。把虚拟机端设置成桥接连接方式[3],这样虚拟机就可以当成独立机。主机IP地址为192.168.131.153 ,虚拟机地址为192.168.131.152,通过ping命令检验互通性。

3 跨平台通信设计

3.1 Linux平台服务器设计

通过此函数把消息发送给每个连接的客户端;服务端程序父子进程分别负责发送和接收数据,以避免数据冲撞;本程序服务端端口号设定为:3490,端口绑定函数int bindPort(unsigned short int port) ,此函数用来创建socket(AF_INET,SOCK_STREAM,0)流套接字,并绑定到指定的端口,在Linux操作系统下不需要初始化。

当有客户端请求连接时,accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)用来接受客户端连接。连接成功后,服务器创建子进程,子进程ppid = fork()。父进程负责接收数据,子进程负责发送数据,把接收到的数据转发给已连接的客户端。

3.2 客户端设计

因为此程序为聊天室,所以客户端设计分为Windows平台和Linux平台。

3.2.1 Windows平台客户端设计

Windows客户端采用MFC框架来编写socket程序[4]。打开Visual C++6.0新建MFC应用程序,添加两个窗体,分别为登陆窗口和聊天室窗口。在登陆窗体中添加3个textBox控件,分别为textBox1(昵称输入框)、textBox2(服务器IP输入框)、textBox1(服务器端口号输入框),并添加两个button控件,分别为button1(登陆)、button2(退出)。在聊天室窗体中添加两个textBox控件,分别为textBox1(消息显示框)、textBox2(消息输入框),并添加两个button控件,分别为button1(发送)、button2(退出)。

请求连接:新建socket、ServerIP和Port分别表示服务器IP地址和端口号,通过函数Connect(ServerIP,Port)连接到Linux服务器端,成功以后即可收发数据。

发送与接收消息:定义发送的字符串为Message,将消息输入框textBox1中的内容指定为Message,通过send()函数进行消息发送。新建一个byte数组byte[] RecvBuffer,通过Recv(RecvBuffer)函数将接收到的消息存放到RecvBuffer中,接收成功后,将内容显示到显示框。

3.2.2 Linux平台客户端设计

Linux平台客户端使用C语言编写。首先创建客户端套接字clientfd = socket(AF_INET,SOCK_STREAM,0),第二个参数表明为流式套接字,即面向连接;然后请求连接服务器端,通过connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(struct sockaddr))这个函数请求。连接成功后,创建子进程pid = fork(),父进程用于发送信息,子进程用于接收信息。

4 运行结果分析

4.1 启动Linux服务器端

4.2 启动Windows客户端

打开Visual C++编译、连接成功后,出现登录窗体,输入姓名、服务器IP地址和端口号,点击连接,和Linux端进行连接。此时用两个客户端进行测试。和服务器端连接成功后,Windows客户端和Linux客户端可以组建一个聊天室收发消息。以Windows其中的一个客户端为例,在消息输入框中输入消息,点击发送,Linux服务器端接收到消息,然后转发给其它客户端,3个客户端分别发送完消息后,Windows其中一个客户端显示内容如图3所示。

4.3 启动Linux客户端

在Linux系统下执行完上述命令后,客户端就和服务器连接了, Linux客户端可以一边发送

消息,一边接收服务器发来的消息,Linux客户端显示如图4所示。

5 结语

本文研究了Linux与Windows之间的通信问题。双方采用TCP/IP协议,运用socket接口来开发网络通信程序。本程序实现了网络聊天室功能,服务器能向不同的客户端同时转发另一个客户端发来的消息,不同用户可对消息及时共享。经过测试,本程序达到预期效果。

参考文献:

[1] 李峰.利用流式Socket编程实现Windows与Linux的通信[J].微计算机信息,2006(1):112118.

[2] 郭勇.利用Socket开发客户/服务器应用[J].广西师范大学:自然科学版,2000,18(1):2426.

[3] 周西峰,陆鹏,郭前岗. 利用流Socket实现Windows与Linux平台间的网络通信[J].微型机与应用,2013,32(18):4952.

[4] 多纳霍,卡尔福特.TCP/IP socket编程[M].陈宗斌,译.北京:清华大学出版社,2009.

英文摘要Abstract:In order to achieve the crossplatform communication of Linux and Windows, and make information sharing timely,the article build a communication program of internet chatroom for crossplatform.First,it build environment of crossplatform communication , and then use network programming interface of socket.The whole system adopts a Client/Server(C/S) model, using MFC framework to write Windows client, Linux, including server and client, use C language to realize.It is tested that client of Linux and Windows can successfully connect to the server.Then it can realize the function of the crossplatform internet chatroom.

socket通信篇6

    本系统总体设计是客户端实现用户的注册和登陆界面设计与美化工作,利用Socket编程实现和服务器通信,服务器能处理客户端发出的请求,并能实现消息反馈。服务器实现与数据库连接,实现添加、删除和修改用户信息,实现多线程支持多个客户端用户同时在线。具体流程如下图:

    2系统功能与实现

    2.1功能设计

    系统要求用户在登陆界面可以随时浏览企业的通知等动态信息,提供用户在日常生活中用到的日历、计算机等小工具,用户可以收藏自己感兴趣的网站并查看网页排名。用户在登陆前进行注册,为维护用户信息安全,需邮箱确认。为保证数据的安全性,采用C/S模式,通过服务器获取数据信息,减少客户端PC的运行负荷,充分发挥客户端PC的处理能力,提高响应速度 。

    2.2模块分析

    系统主要实现的功能模块有四个,分别是:用户桌面模块、系统管理模块、数据库模块、后台服务器模块。下面对这几个模块进行分析。用户桌面模块:用户桌面模块即客户端,用来显示主界面、注册界面、登录界面。主界面提供输入用户名、密码的登录操作;注册界面提供用户注册时需注册的姓名、性别、手机等基本信息;登录界面提供用户成功登录后显示企业的动态信息、用户日常使用的小工具及用户可以自己收藏的网站等。

    系统管理模块:系统管理模块实现对系统进行维护和管理。数据库模块:数据库模块实现对整个系统的数据信息的存放和更新。后台服务器模块:后台服务器模块实现各模块之间数据的转发,实现多线程,完成数据更新,实现客户端、数据库及服务器三者的交互。

    3系统实现的主要技术

    3.1数据库设计

    系统数据库配置是采用ODBC数据源加载SQL2008数据库,使用SQL数据库查询语言。数据库设计按照确定建立数据库目的和收集数据、建立概念模型、建立数据模型、实施与维护数据库四个步骤。

    数据库模型采用关系(E-R)模型,关系模型是以二维表形式展现,对数据进行划分分析后,优化的关系数据模型的数据结构可分为3张表:表1(用户表)存放用户姓名、密码、邮箱等基本信息、表2(企业表)存放企业的通知等相关信息、表3(产品表)存放企业产品的编号、价格、库存等基本信息。

    3.2客户端与服务器连接

    客户端与服务器的连接是实现的难点。客户端是C#编写,客户端用C++编写。可以采用Socket编程。服务器端采用C++的Socket编程,完成对数据库SQL2008的登陆连接,保证数据库只存在于服务器端,通过对于不同权限的用户,设定不同的SQL执行权限,从而保证数据的安全性。客户端采用C#的Socket编程,利用TCP协议、与服务器端统一端口号与IP地址进行连接。具体步骤如下:服务器端:

    (1)加载套接字库,创建Socket;

    (2)绑定Socket到一个IP地址和端口;

    (3)将Socket设置为监听模式等待连接请求;

    (4)请求到来接受连接请求,返回一个新的对应于此次连接的Socket;

    (5)用返回的Socket和客户端进行通信;

    (6)关闭Socket,关闭加载的套接字库。

    客户端:

    (1)用指定的端口号和服务器IP创建一个EndPoint对象

    (2)创建一个基于TCP协议的套接字;

    (3)利用Socket对象的Connect()方法向服务器发送连接请求;

    (4)如果连接成功,利用Socket对象的Send()方法向服务器发送消息;

    (5)利用Socket对象的Receive()方法接收服务器发来的消息;

    (6)通信结束,关闭Socket。控制流程:

    4结束语

socket通信篇7

[关键词] socket tcp协议 服务器 客户端 线程

一、引言

随着信息技术的高速发展,网上交谈已成为人们学习和工作的重要手段,那么如何设计合理的、人性化的网上交谈工具就成为当务之急。使用visual c#.net中的socket编程技术,以及多线程的知识可快速、方便地设计理想的网上交谈工具。一个socket通信无论功能多么齐全、程序多么复杂,其基本结构均应包括以下步骤:创建socket对象,建立连接;打开连接到socket的输入/输出流;对socket进行读写操作;关闭socket套接字,关闭流。

二、tcp协议通信的流程

tcp协议是面向连接的协议,它的实现需要数据发送方和数据接收方建立数据通信连接,它的具体流程如下:

1.服务器端首先创建服务器套接字

2.服务器套接字监听一个端口,等待客户端的请求

3.客户端创建一个客户端套接字

4.客户端向服务器发送连接请求

5.服务器确认与客户端的连接

6.客户端和服务器利用建立的连接进行通信

7.通信完毕后,客户端和服务器关闭各自的连接

三、socket编程简介

1.利用socket建立服务器程序

要用socket建立一个tcp服务器程序,一般需要以下几个步骤:

(1)创建一个服务器套接字,用ip地址和端口初始化服务器

(2)监听服务器端口

(3)确认与客户端的连接

(4)处理客户端的请求并回应客户端

(5)断开客户端的连接,释放客户端的连接

(6)关闭服务器,释放服务器连接

2.利用socket建立客户端程序

要用socket建立一个tcp客户端程序,一般需要以下几个步骤:

(1)创建客户端套接字

(2)连接服务器

(3)得到与服务器通信的流通道

(4)向服务器发送数据

(5)接收从服务器发回的数据

(6)断开连接

四、设计方案

1.服务器端的设计

服务器端管理着交谈任务,它维持着一张当前在线用户的列表,转发用户发送来的信息,主要功能如下:

监听本机ip地址中的一个指定的端口。

当有客户端向该端口发出请求时,服务器程序立即建立一个与该客户端的连接并启动一个新的线程来处理该客户端的所有请求。

根据客户端发送来的各种不同的请求,执行相应的操作,并将处理结果返回给该客户端。服务器能识别4种请求命令:conn(建立新的连接)、chat(聊天)、priv(私聊)和exit(离开),服务器接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

2.客户端的设计

客户端应用程序包含用户登录窗口和用户交谈的主窗口,它允许用户登录到服务器,可以向服务器发送信息,同时可以接收从服务器返回的信息,设计的主要功能如下:

向远程服务器发送连接请求。

得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道(networkstream)。

通过网络流通道与服务器端的程序进行数据通信。向服务器发送服务器能够识别的以上4种命令请求,同时也接收服务器发回的命令。客户端能够识别的命令有join(通知当前在线用户有新的用户进入聊天室)、list(更新当前在线用户)和quit(关闭客户端程序)。客户端程序接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

五、解决方案

1.服务器端的实现

服务器端是一个windows窗体应用程序,命名为chatserver。当运行服务器程序时,单击服务器窗体上的“启动”按钮后,便启动了服务器进程。为了使用socket对象和thread对象,在代码文件中加入名字空间system.net、system.net..socket、system..threading的引用。

在服务器端使用了多线程,每个用户通过一个单独的线程进行连接,当服务器开始运行时,它就启动一个线程等待客户连接(在方法startlisten()中实现)。当接收到一个请求时,服务器立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。自定义了一个client类,它用于保存每个当前在线用户的用户名和与服务器连接的socket对象。当socket连接一旦建立,就马上将其保存在一个client对象中,以便让每个用户有自己的socket,以后可以对不同用户的socket对象进行操作,实现与客户端的数据交换。

在服务器窗口中,单击“启动”按钮,进入btnstart_click处理程序。在该处理程序中,创建了一个服务器套接字并且监听本机ip地址中的一个指定的端口,同时启动一个线程等待用户连接(在方法startlisten()中实现)。startlisten()方法是在新的进程中进行的操作,它主要用于当接收到一个客户端请求时,确认与客户端的连接,并且立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。serviceclient()方法用于和客户端进行数据通信,包括接收客户端的请求,根据不同的请求命令,执行相应的操作,并将处理结果返回到客户端,此方法完成了服务器的主要的工作。sendtoclient()方法实现了向客户端发送命令请求的功能,它利用不同用户保存的socket对象,向对应的用户发送命令请求。getuserlist()方法实现了获取当前在线用户列表的功能,它通过对clients数组的遍历,获取当前在线用户的用户名,用字符串发回。

2.客户端的实现

客户端是一个windows窗体应用程序,命名为chatclient。当运行客户端程序时,首先进入登录界面,输入用户名,单击“登录”按钮后,进入交谈主窗口(命名为login),在主窗口中可以向服务器发送信息,同时可以接收从服务器返回的信息。

(1)login.cs文件的实现

login.cs文件是登录窗体的代码文件,为了使用socket对象,在代码文件中加入名字空间system.net 、system.net..socket的引用,它主要实现了创建客户端套接字同时连接到服务器指定端口,把用户名和创建的客户端套接字传递给chatclient窗体。

(2)chatclient.cs文件的实现

chatclient.cs文件是客户端窗体(chatclient)的代码文件,在该文件中,首先获得与服务器通信的流通道,在用户登录后,向服务器发送conn命令以此说明有新的用户进入交谈室,服务器将返回所有的当前在线用户的呢称,选择不同的人,就可以与他们交谈了,如果选中“悄悄话”复选框,则具有私人交谈的功能。

当加载chatclient窗体时,便会进入chatclientform_load处理程序。在该处理程序中,首先显示用户登录窗口。如果登录成功,那么获取与服务器的连接并得到与服务器数据交互的流通道,向服务器发送conn请求命令,同时启动一个新的线程用于响应从服务器发回的信息(在方法serverresponse()中实现)。serverresponse()方法用于和服务器进行数据通信,主要是接收从服务器发回的信息,根据不同的命令,执行相应的操作。当需要进行“私人交谈” 时,便进入pricheckbox_checkedchanged处理程序。在该处理程序中主要对privatemode的布尔属性进行设置。当需要发送信息时,便会进入btnsend_click处理程序。在该处理程序中,如果privatemode的布尔属性值为false(不是私人交谈),将chat命令发送给服务器;否则(为私人交谈),将priv命令发送给服务器。当用户需要离开时,便进入了btnexit_click处理程序。在该处理程序中,将exit命令发送给服务器,停止交谈。

六、结束语

使用socket编程的关键技术可以方便地实现网上交谈工具。利用socket可以创建服务器程序和客户端程序。服务器监听本机ip地址中的一个指定的端口,建立与客户端的连接并启动一个新的线程来处理客户端的所有请求,执行相应的操作,并将处理结果返回给该客户端。客户端向远程服务器发送连接请求,得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道并通过网络流通道与服务器进行数据通信。我们可以进一步进行功能完善,进而编译成组件应用到自己的应用程序中,开发更完美的通信软件。

参考文献:

[1]谭桂华魏亮等:visual c#高级编程范例.北京:清华大学出版社,2004年5月

[2]吕伟臣霍言等:visual c# 2005入门与提高.北京:清华大学出版社,2006年9月

socket通信篇8

关键词: WinSock;远程测控系统;单片机;Visual C++

随着社会的不断发展,远程测控技术被应用于各个生活生产的领域中。例如:在公用工程和环境保护,以及楼宇等方面的自动化领域。不仅实现着对系统和用户的管理,还实现着对设备的测控和数据的显示,以及报警和综合共享一体化等。基于WinSock的远程测控系统在充分利用现有资源的条件下,实时获取信息和进行控制,以操作便捷和高性能的优势,确保资源分配更为合理。因此,远程测控系统将在通信技术日新月异的今天有着突破性的发展。

1 WinSock通信原理及编程实现

WinSock主要是指由Socket发展能够支持多种协议的网络编程接口。其中,Socket是套接字,是目前网络通信应用程序接口最为先进的接口之一。Socket可以作为不同机主间双向通信的端点:本地机主和远地机主,并构成网络编程界面。Socket的数据交换一般只与同一个域中的Socket进行,只规范支持单一的Internet域,而各种进程在使用该域的时候则采用TCP/IP协议来完成通讯。目前所使用的Socket分为:流Socket和数据报Socket。前者不仅拥有双向有序和无重复的数据流服务,而且还具有无记录边界的数据流服务;而后者虽然支持双向的数据流服务,但是无法确保它的可靠性和有序性,以及无重复性。其编程的实现是通过WinSock API直接与TCP/IP进行通讯。如下图1所示:

2 基于WinSock的远程测控系统总体结构

由于远程测控的现场具有分散性,对测控任务的完成必须要通过多个测控点来实现,例如:对小区的智能管理、对楼宇的监控等等。因此,基于WinSock的远程测控系统的设计可以采用一点对多点的分布式结构,在具备多点测控功能的条件下实现对远程测控点监控。其系统的结构如图2所示。

通过图2得知该系统由单片机采集系统、本地客户机网络、远程主机网络三方面所构成。单片机采集系统和本地测控客户机两者间的数据采集方式是通过串行通信进行。

当远程测控系统处于工作状态的时候,单片机采集系统会对本地客户机所发送的通道地址进行辨别,辨别的结果如果一致,那么就利用MAX491将所采集的数值发送到本地客户机。其中,远程测控系统还可以同时将采集到的32路数据发送到本地客户机中,并对采集系统进行控制。本地客户机还可以将数据传送到远程主机上,远程主机利用网络能够对指定的监控点进行监控。

3 基于WinSock的远程测控系统设计

3.1 系统设计

1)单片机与串行通信的设计

由于P89LPC935的单片机所构成的采集系统成本低、电路简单,能够在通过系统进行程序的升级,因此,利用型号为P89LPC935的单片机作为单片机采集系统的关键点,在支持串口通信与ISP的同时,还具有2路D/A与8路A/D转换器。远程测控系统由于要实现数据的采集和显示、系统的初化和A/D转换,以及对单片机的控制和串口数据的发送与接收,因此,该系统在硬件设计方面将采用单片机和ISP编程电路、电压和温度采集,以及型号为MAX491串口通信等方面构成。

串行通信主要是进行采样数据的传送,利用广播方式对数据进行发送,在每个采集终端设定地址,当数据发送模式传送采用数据到计算机,计算机通过串行接口模块传送数据并由采集终端监测地址是否属于该通道,如果是将执行数据传送到客户机的命令,相反则不执行命令,以达到控制单片机的目的。

2)本地客户机和远程主机的设计

由于本地客户机和远程主机都是通过Visual C++的WinSock编程实现,因此本地客户机测控软件主要用来实现对单片机采集系统和远程主机串行通信与网络通信,并建立于客户机数据和控制信息间的交流。远程主机初始化本地窗口,利用Socket建立和绑定本地端口,再用Bind()指定本机地址。通过侦听端口用Listen()侦听连接请求,在接收请求后,并通过Send()函数发出控制指令,在结束通信时利用Close()函数断开连接服务器关闭;而本地客户机在打开通信信道的时候与特定端口相连接,并向服务器发送请求,直至来建立连接,本地客户机将通过串口通信利用Send()函数发送单片机采集数据到远程主机中,直接进行控制命令。

3)对Socket程序的设计

由客户端对监听端口的创建和服务器端对监听Socket的创建。只要数据到达,就会及时与Socket联系,并且客户端为了能够实现服务器端的通信,还要建立一个类CSocketClient。在Listen()函数监听到连接时,新建CclientSocket通过重载OnAccept()函数进行处理。在数据进行接收时,则重载OnReceive()函数进行实现,其中,对数据进行处理的函数为DoProcessData。当接收数据以后,对该接收的数据进行校验和解析,并将解析后的新数据存入动态的数组。最后进行资源的释放,删除所有不用的Socket。

3.2 系统实现

因为WinSock是种处于底层的数据传输通信技术,并且它扩展于Unix,能够使用所有的Windows操作系统,所以该技术不仅通信效率很高,而且还具有很好的跨网域特性。对系统的实现首先要创建Csocket调用类的构造函数对象和创建Socket句柄调用Create成员,利用Create函数向服务器Sock发送连接请求,由Accept函数接收请求。其次要对CSocket对象中的其它成员函数进行调用,并执行Sock的通信与操作。最后要对Csocket对象进行删除。由于WinSock服务器与客户端之间只针对字节流进行传送,因此,只有在服务器与客户端之间建立通信协议,将字节流转换成为控制指令才能进行控制。其远程测控如下图3所示:

随着信息技术的不断发展,网络在全球的遍布,使通讯变得更为容易和方便。目前,远程测控系统的发展方向由集中测控转变成为远程分布式测控。总而言之,基于WinSock的远程测控系统是根据多点远程数据采集的实际需求,结合互联网技术和数据采集技术进行单片机与串行通信的设计、本地客户机和远程主机的设计,以及对Socket程序的设计。从最大程度上扩展传输距离,通过对多个监控点进行数据的检测和控制实现。

项目基金号:淮南市科技计划项目资助,项目编号:2011A07913

参考文献:

[1]刘业颜、郑文,基于WINSOCK的远程信号采集与分析系统[J].机电工程技术,2010年01期.

[2]李新超、莫琦,基于WinSock的远程测控系统设计[J].茂名学院学报,2007年03期.

[3]庞文尧、蒋静坪,基于Winsock和SQL Server的远程控制实验研究[A].中国仪器仪表学会学术论文集[C].2004年.

[4]马长青、苏庆堂、刘贤喜,用WinSock开发C/S间的网络通信程序[J].农业网络信息,2004年01期.

作者简介:

上一篇:异步通信范文 下一篇:无线通信技术范文