基于Wince的网络通讯编程

2017-03-06 17:05瞿苏
电脑知识与技术 2016年30期

瞿苏

摘要:网络是一个奇迹,它将人们带入一个丰富多彩的新世界,使人们更方便地交流以及实现资源共享。如今的嵌入式计算机、PAD以及智能手机提供了强大的网络支持,可以非常方便地访问局域网乃至互联网。掌握Windows CE网络编程技术,对人们来说就显得尤为重要。在Windows CE中进行网络编程,需要首先了解Winsock套接字基础知识,然后再了解套接字基础知识在TCP通讯上的运用。

关键词:Windows CE;socket;TCP

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)30-0058-03

The Network Communication Programming Based on Wince

QU Su

(Yangzhou Business branch of Jiangsu Union Technical Institue, Yangzhou 225000, China)

Abstract: Internet is a miracle, it brought people into a colorful world, make people more convenient communication and realize resources sharing. Now embedded computer, PAD, and smart phone provides a strong support network, can be very convenient to access to the LAN and the Internet. Master Windows CE network programming technology, it is very important to people. Network programming in Windows CE, need to first understand the Winsock basic knowledge of the socket, and then understand the basic knowledge of the socket in the use of TCP communications.

Key words: Windows CE; socket;TCP

1 套接字編程基础

1.1 简介

BSD UNIX规范定义的一套MicrsoftWindows下的网络编程接口,规范中包含了Windows的扩展库函数和BerkeleySocket风格的库函数。

所有的应用程序开发者可使用Windows Sockets规范提供的一套简单的API函数和共同遵守这项规范。Windows Sockets有一个接口,为二进制接口(ABI),目的是为了保证Windows Sockets API应用程序的所有软件供应商都能够遵循Windows Sockets协议而工作。

网络软件供应商可以充分地使用Windows Sockets规范定义的库函数和相关语义。

“Windows Sockets兼容的”的含义是遵守Windows Sockets规范的网络软件。任何一个网络软件供应商必须完全实现Windows Sockets规范,才能正在做到Windows Sockets兼容。其中,Windows Sockets规范涉及两个概念“提供者”和“Windows Sockets应用程序”。“提供者”即Windows Sockets兼容实现的提供者;“Windows Sockets应用程序”即被称为具有Windows Sockets接口,是能够与Windows Sockets兼容实现协同工作的任何应用程序。

如“应用程序同Winsock关系图”所示,Windows Sockets利用网络编程、网络通讯协议服务和操作系统,实现应用程序之间实际的通讯工作,并且Windows Sockets应用程序调用Windows Sockets 的API以实现相互之间的通讯。

1.2 Windows CE平台中的SocketAPI函数

1.2.1 创建套接字

可以通过socket函数来创建套接字,它的声明如下:

当socket函数返回套接字句柄时,表明创建套接字成功;当socket函数返回Invalid_socket,表明创建套接字不成功,同时可以通过调用WSAGetLastError函数,获取具体错误代码。

1.2.2 关闭套接字

Closesocket函数,即关闭套接字。当创建的套接字,然后不再使用时需关闭并释放资源,可调用Closesocket函数。当程序员想调用closesocket函数之前,必须先调用shutdown函数,该过程的目的是“从容中断连接”。为了防止调用closesocket函数时产生负面影响,数据可能会丢失的现象发生。因此提出了“从容中断连接”技术,即通信方收到应用程序发出所有数据时,应报证通信方立刻通知接收端“不再发送数据”。

Shutdown函数的定义如下:

1.2.3 绑定套接字

创建好套接字后,需通过bind函数将其绑定到一个已知的地址上。Bind函数的定义如下:

当返回值为SOCKET_ERROR时,表明调用bind函数出错。

如果另一个进程同本地IP接口和端口号绑定到一起了,表明使用了TCP/IP,或者可能是那个IP接口和端口号处于TIME_WAIT状态。调用bind函数时,则会出现最常见的错误WSAEADDRINUSE。还有一种情况,如果针对一个已经被绑定的套接字调用了bind函数,则会返回WSAEFFAULT错误。

有两个特殊的IP地址可对特殊情况下的套接字行为产生影响,比如绑定套接字和本地接口连接时,网络将运用特殊地址来监听连接。其中,用于一个IP网络中发送广播UDP数据报的特殊地址是INADDR_BROADCAST,在使用该地址时,需设置套接字选项SO_BROADCAST。

建立一个TCP连接时绑定套接字的方法。

1.2.4 监听套接字

程序员编写TCP服务器端,将套接字与本地地址绑定后,调用listen函数,并将套接字设置为监听模式,等待与客户端连接。

Listen函数的定义如下:

1.2.5 等待连接

服务器端与客户端连接,客户端發出连接请求,服务器端则调用accept函数。当accept函数调用成功后,将返回一个新的套接字,与客户端的套接字连接进行通讯。

accept函数的定义如下:

调用accept函数有两种调用方式,分别是阻塞调用和非阻塞调用。当套接字为阻塞模式时,accept函数以阻塞方式执行,当等待队列中出现一个等待连接时,它才接收等待连接中的第一个连接请求。当套接字为非阻塞模式时,只要等待队列中存在连接请求,它将接收等待连接中的第一个连接请求,否则将返回INVALID_SOCKET。如果调用WSAGetLastError函数返回WSAEWOULDBLOCK值,则表示等待队列目前已经不存在请求。

1.2.6 建立连接

调用connect函数可以将TCP客户端与TCP服务器建立。当connect函数的返回值为0,套接字为阻塞方式时,表明和TCP服务器端已经建立了连接。如果connect函数的返回值为SOCKET_ERROR,表明和TCP服务器端连接失败。connect函数定义如下:

1.2.7 发送数据

套接字可以分为连接的套接字和非连接的套接字。程序员可以通过send函数实现连接套接字发送数据。send函数的定义如下:

2 TCP编程概述

TCP(Transmission Control Protocol 传输控制协议),是在主机间实现高可靠性的包交换传输的一种协议。在网络高速发展的今天,TCP的应用非常广泛,人们可以通过它来传输数据安全性要求较高的数据。TCP是一种无差错无重复的顺序数据传输方式,同时TCP的套接字为流式套接字。源程序和目标程序利用TCP通信时,它们之间便搭建了一个虚拟连接进行通讯,两台计算机之间是以双向字节流形式而数据交换。

如TCP服务器和客户端流程图所示,TCP服务器端编程的流程为:1)TCP服务器端调用socket函数建立流式套接字;2)调用bind函数绑定本地地址;3)通过调用listen函数监听客户端连接;4)当监听到客户端连接请求时,服务器套接字调用Accept函数,并接受客户端连接请求建立连接;5)服务器端新加一个单独的套接字,与客户端进行通讯。

TCP服务器端与TCP客户端过程比较而言,TCP客户端编程过程简单些。可分为如下几个过程: 1)客户端调用socket函数建立流式套接字;2)TCP客户端调用connect函数,请求与TCP服务器端连接;3)成功建立连接;4)TCP客户端同TCP服务器端通讯。

下面以“打开TCP服务”为例,了解套接字中函数使用的方法与过程。

1)初始化Socket资源;2)创建TCP监听套接字;3)当创建完TCP监听套接字后,调用bind函数绑定套接字和本地地址;4)监听套接字开始监听;5)监听线程处理与客户端的连接。

Open函数的定义如下:

当然,对于实际的项目,在使用时还应当根据实际情况做适当的修改。

3 总结

Microsoft Windows CE是一个紧凑、高效和可扩展的操作系统,适应于多种嵌入式产品。它的特点是拥有多任务、多线程、确定性的实时、完全抢先式优先级的操作系统环境,专门面向的是只有有限资源的硬件系统。本文首先介绍了套接字编程基础中套接字的基本命令,然后介绍了套接字在TCP编程上的使用。

参考文献:

[1]汪兵. Windows+CE+嵌入式高级编程及其实例详解(用C++实现)[M]. 北京:中国水利水电出版社, 2008:406-471.

[2]周建设.Windows+CE设备驱动及BSP开发指南[M].中国电力出版社,2009:211-229.

[3]尹乐,许刚强.Windows+CE项目开发实践丛书[M].中国高新技术企业,2014(12):17-18.

[4]刘耀钦.在何时该用什么方式编译WinCE[J].河南工程学院学报:自然科学版,2015(3):77-78.