WinSock介绍(zz)

Winsock网络编程接口 Winsock 是一套开放的、支持多种协议的 Windows网络编程接口,是 Windows 网络编程上的标准接口。应用程序通过调用 Winsock 的 API 实现相互之间的通信,而 Winsock利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。        套接字(Sockets)是通信端点的一种抽象,是支持 TCP/IP  协议网络通信的基本操作单元,它提供了一种发送和接 阅读详情
 

Windows下网络编程的规范-Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。

Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,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规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口.应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图

通信的基础是套接口(Socket),一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。

一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个对称协议的例子是Internet中用于终端仿真的TELNET。而非对称协议的例子是Internet中的FTP。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"客户进程"和"服务进程"。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。这一请求/相应的过程可以简单的用图表示。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。

数据报套接口可以用来向许多系统支持的网络发送广播数据包。要实现这种功能,网络本身必须支持广播功能,因为系统软件并不提供对广播功能的任何模拟。广播信息将会给网络造成极重的负担,因为它们要求网络上的每台主机都为它们服务,所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接口中。广播通常是为了如下两个原因而使用的:1. 一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址又没有任何先验的知识。2. 一些重要的功能,例如路由要求把它们的信息发送给所有可以找到的邻机。被广播信息的目的地址取决于这一信息将在何种网络上广播。Internet域中支持一个速记地址用于广播-INADDR_BROADCAST。由于使用广播以前必须捆绑一个数据报套接口,所以所有收到的广播消息都带有发送者的地址和端口。

Intel处理器的字节顺序是和DEC VAX处理器的字节顺序一致的。因此它与68000型处理器以及Internet的顺序是不同的,所以用户在使用时要特别小心以保证正确的顺序。任何从Windows Sockets函数对IP地址和端口号的引用和传送给Windows Sockets函数的IP地址和端口号均是按照网络顺序组织的,这也包括了sockaddr_in结构这一数据类型中的IP地址域和端口域(但不包括sin_family域)。考虑到一个应用程序通常用与"时间"服务对应的端口来和服务器连接,而服务器提供某种机制来通知用户使用另一端口。因此getservbyname()函数返回的端口号已经是网络顺序了,可以直接用来组成一个地址,而不需要进行转换。然而如果用户输入一个数,而且指定使用这一端口号,应用程序则必须在使用它建立地址以前,把它从主机顺序转换成网络顺序(使用htons()函数)。相应地,如果应用程序希望显示包含于某一地址中的端口号(例如从getpeername()函数中返回的),这一端口号就必须在被显示前从网络顺序转换到主机顺序(使用ntohs()函数)。由于Intel处理器和Internet的字节顺序是不同的,上述的转换是无法避免的,应用程序的编写者应该使用作为Windows Sockets API一部分的标准的转换函数,而不要使用自己的转换函数代码。因为将来的Windows Sockets实现有可能在主机字节顺序与网络字节顺序相同的机器上运行。因此只有使用标准的转换函数的应用程序是可移植的。

在MFC中MS为套接口提供了相应的类CAsyncSocket和CSocket,CAsyncSocket提供基于异步通信的套接口封装功能,CSocket则是由CAsyncSocket派生,提供更加高层次的功能,例如可以将套接口上发送和接收的数据和一个文件对象(CSocketFile)关联起来,通过读写文件来达到发送和接收数据的目的,此外CSocket提供的通信为同步通信,数据未接收到或是未发送完之前调用不会返回。此外通过MFC类开发者可以不考虑网络字节顺序和忽略掉更多的通信细节。

在一次网络通信/连接中有以下几个参数需要被设置:本地IP地址 - 本地端口号 - 对方端口号 - 对方IP地址。左边两部分称为一个半关联,当与右边两部分建立连接后就称为一个全关联。在这个全关联的套接口上可以双向的交换数据。如果是使用无连接的通信则只需要建立一个半关联,在发送和接收时指明另一半的参数就可以了,所以可以说无连接的通信是将数据发送到另一台主机的指定端口。此外不论是有连接还是无连接的通信都不需要双方的端口号相同。

在创建CAsyncSocket对象时通过调用
BOOL CAsyncSocket::Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL )通过指明lEvent所包含的标记来确定需要异步处理的事件,对于指明的相关事件的相关函数调用都不需要等待完成后才返回,函数会马上返回然后在完成任务后发送事件通知,并利用重载以下成员函数来处理各种网络事件:

标记事件需要重载的函数
FD_READ有数据到达时发生void OnReceive( int nErrorCode );
FD_WRITE有数据发送时产生 void OnSend( int nErrorCode );
FD_OOB收到外带数据时发生void OnOutOfBandData( int nErrorCode );
FD_ACCEPT作为服务端等待连接成功时发生void OnAccept( int nErrorCode );
FD_CONNECT作为客户端连接成功时发生void OnConnect( int nErrorCode );
FD_CLOSE套接口关闭时发生void OnClose( int nErrorCode );
我们看到重载的函数中都有一个参数nErrorCode,为零则表示正常完成,非零则表示错误。通过int CAsyncSocket::GetLastError()可以得到错误值。

 

下面我们看看套接口类所提供的一些功能,通过这些功能我们可以方便的建立网络连接和发送数据。

  • BOOL CAsyncSocket::Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL );用于创建一个本地套接口,其中nSocketPort为使用的端口号,为零则表示由系统自动选择,通常在客户端都使用这个选择。nSocketType为使用的协议族,SOCK_STREAM表明使用有连接的服务,SOCK_DGRAM表明使用无连接的数据报服务。lpszSocketAddress为本地的IP地址,可以使用点分法表示如10.1.1.3。
  • BOOL CAsyncSocket::Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL )作为等待连接方时产生一个网络半关联,或者是使用UDP协议时产生一个网络半关联。
  • BOOL CAsyncSocket::Listen( int nConnectionBacklog = 5 )作为等待连接方时指明同时可以接受的连接数,请注意不是总共可以接受的连接数。
  • BOOL CAsyncSocket::Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL )作为等待连接方将等待连接建立,当连接建立后一个新的套接口将被创建,该套接口将会被用于通信。
  • BOOL CAsyncSocket::Connect( LPCTSTR lpszHostAddress, UINT nHostPort );作为连接方发起与等待连接方的连接,需要指明对方的IP地址和端口号。
  • void CAsyncSocket::Close( );关闭套接口。
  • int CAsyncSocket::Send( const void* lpBuf, int nBufLen, int nFlags = 0 )
    int CAsyncSocket::Receive( void* lpBuf, int nBufLen, int nFlags = 0 );在建立连接后发送和接收数据,nFlags为标记位,双方需要指明相同的标记。
  • int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )
    int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );对于无连接通信发送和接收数据,需要指明对方的IP地址和端口号,nFlags为标记位,双方需要指明相同的标记。
我们可以看到大多数的函数都返回一个布尔值表明是否成功。如果发生错误可以通过int CAsyncSocket::GetLastError()得到错误值。

 

由于CSocket由CAsyncSocket派生所以拥有CAsyncSocket的所有功能,此外你可以通过BOOL CSocket::Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL )来创建套接口,这样创建的套接口没有办法异步处理事件,所有的调用都必需完成后才会返回。

在上面的介绍中我们看到MFC提供的套接口类屏蔽了大多数的细节,我们只需要做很少的工作就可以开发出利用网络进行通信的软件。

Hibernate 原生 SQL Hibernate 原生 SQL 原生 SQL 如果你想使用数据库特定的功能如查询提示或 Oracle 中的 CONNECT 关键字的话,你可以使用原生 SQL 数据库来表达查询。Hibernate 3.x 允许您为所有的创建,更新,删除,和加载操作指定手写 SQL ,包括存储过程。 您的应用程序会在会话界面用 createSQLQuery() 方法创建一个原生 SQL 查询: public SQLQuery createSQLQuery(String sqlString) throws Hiber 阅读详情

相关推荐

Netapp FAS2750热备盘替换失败问题分析与解决

本文深入分析了Netapp FAS2750存储系统中热备盘替换失败的故障现象,揭示了磁盘分区属主不匹配导致数据同步无法启动的根本原因。通过详细的排查步骤和解决方案,帮助运维人员快速恢复aggr状态,并提供了长期预防措施和最佳实践建议,确保存储系统的高可用性。

weixin_33737774的博客 366

Winsock简介

 Winsock是一个标准的网络应用程序编程接口(API),与协议无关的接口(protocol-independent interface),而不是一个协议Winsock接口大多继承于UNIX平台上的BSD套接字Winsock 2更新或添加了新的API函数,会在函数名前加上WSA前缀 Winsock Headers and Libraries1.除了Windows CE只使

人生如棋 2203

七天征服AutoSAR/SomeIP_01速成配置并代码生成

本文为AutoSAR中SomeIP配置开发的实操指南摘要,重点介绍通过通信矩阵快速构建SomeIP工程的方法。核心内容包括:1)基于Excel通信矩阵生成系统描述文件(arxml);2)在AutoSAR工具中导入文件自动生成协议栈配置,涵盖ETHIF、SoAd等模块;3)关键报错处理(COM/PDUR/SOAD/SD模块的配置修正);4)SomeIPXF的数据编解码配置;5)SWC组件与RTE任务映射。教程强调"先完成再完美"的实践原则,指导开发者快速生成基础代码框架,为后续协议调试奠定

大叔带刺的博客 209

第1章 Winsock简介

Microsoft Windows网络编程第2版    杨合庆 译         清华大学出版社 对应的英文书名:Network Programming for Microsoft Windows 2nd 1 winsock网络接口,不是协议。 2 Winsock有1和2两个版本,通过函数前缀WSA可以区分,Winsock2函   数前有WSA前缀。但有几个例外WSASta

秦黎明的博客 1197

使用WinsockWinsock入门

以下是Windows套接字编程入门的分步指南。 它旨在提供对基本Winsock函数和数据结构的理解,以及它们如何协同工作。 用于说明的客户端和服务器应用程序是一个非常基本的客户端和服务器。 Microsoft Windows软件开发工具包(SDK)附带的示例中包含更高级的代码示例。 客户端和服务器应用程序的前几个步骤相同。 关于服务器和客户端 创建一个基本的Winsock应用程序 正在初始化Winsock 以下部分描述了创建Winsock客户端应用程序的其余步骤。 为客户端创建套接字 连接到插座 在客户端

Celestial_empire的博客 1642

Winsock编程框架

   Microsoft的Windows Sockets API是Windows下的网络应用程序接口,为了适用于Windows下的消息机制和异步的I/O选择操作,Windows Sockets API在功能上扩充了将近20个函数,其中扩充的部分均冠以前缀WSA(Windows Sockets Asynchronous),如WSAStartup、WSAClean等,充分体现了Widnows的优越性。

风焱 1715

hibernate 原生sql 查询类型转化的问题

 若数据库中某字段类型为 char 且长度大于1   用户hibernate的createSQLQuery方法查询出来的值为Character类型,   且长度自动只获取了一个字符,   可以通过一下方法解决   sess.createSQLQuery( " SELECT c.sex as sex  FROM CATS c " )  .addScalar( " sex...

sun1102的专栏 162

Hibernate使用原生SQL查询

Hibernate使用原生SQL查询   Hibernate提供了原生的SQL语句的查询,通过createSQLQuery(String)和createNativeQuery(String),createSQLQuery(String)是Hibernate5.x之前的版本的,在Hibernate5.x和之后,都采用的是createNativeQuery(String),使用原生SQL虽然麻烦,但是...

莫负时光 5221

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题@for&ever 2009-9-4 系统环境:MySQL5.1Hibernate3.3 有如下的假定:实体类 Question 和 Answer分别对应数据表 question 和answer。并且表 question 和answer 的字段大部分都一样,字段数目也一样。 执行如下的操作:

for ever的log——永远的足迹 1万+

Hibernate(一)HQL查询、原生sql查询

Hibernate中支持三种查询方式:HQL(Hibernate Query Language),原生sql查询,Criteria查询。HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象、属性的概念;原生sql查询就是我们程序员手动的写sql语句并执行;Criteria查询又称为对象查询,采用真正的面向对象的方式进行查询,原生sql查询和Criteria查询将在后续篇章中进行讲解

代码与酒 6428

Hibernate运行原生sql并将查询的结果转化为对象

原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。下面来描述如何使用这个API进行查询。标量查询(Scalar queries)最基本的SQL查询就是获得一个标量(数值)的列表。sess.createSQLQuery("SELECT * FROM CATS").list();sess.createSQLQuery("SE...

飞天武者的博客 4252

Hibernate原生SQL查询

Hibernate除了支持HQL查询外,还支持原生SQL查询。 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。 执行SQL查询步骤如下: 1、获取Hibernate Session对象 2、编写SQL语句 3、通过Session的createSQLQuery方法创建查询对象 4、调用...

lgxzzz的博客 640

Hibernate原生SQL多表查询字段名重复问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4   系统环境: MySQL5.1 Hibernate3.3   有如下的假定: 实体类 Question 和 Answer分别对应数据表 question 和answer。 并且表 question 和answer 的字段大部分都一样,字段数目也一样。   执行如下的操作:

一个人有了信仰,不管成不成功,至少不会迷茫。 7270

Hibernate 的SQLQuery接口addScalar方法 (原生sql查询)

Hibernate 的SQLQuery接口addScalar方法 查询pojo对象数据(使用原生sql查询); sql拼接中使用到 in('201409','201408')语法; createSQLQuery 和createQuery接口

阿狸_桃子 1万+

hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法

注:实际业务中可能比较复杂不得不用原生sql执行时可能会遇到该问题,为了描述问题,本例采用简单的举例 表1: tbtask: 具有如下列:taskId,name,groupId 表2: tbtaskGroup: 具有如下列:tbgroupId,name 使用原生sql表连接获取task表和group表的name信息 select task.name,group.name from ...

Bolg of EQuaker 1076

Hibernate实战——原生SQL查询

一配置文件 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http:...

实践求真知 784

几种hibernate原生sql查询返回值

1.---SELECT  new map(main.id AS id3333,main.startdate AS startdate) from WeekData main 上述返回值是List>---map的key为as后面的别名,value为实际查询结果 2.---SELECT  new map(main.id,main.startdate) from WeekData main 上述返

u014476019的博客 5247

在hibernate中,如何把原生sql查询出来的结果映射到实体bean

大家都知道hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。 个人觉得,hibernate自带的hql语句却不见得很好用。 现实工作中,有很多场景是用到原生sql进行查询的,比如oracle的递归、复杂语句查询等。或许hql也能进行递归、复杂语句的查询,但像我这种用惯ibatis的,很是不爽hql。 简单举个例子说一下,hq

宇强的一亩三分地 6369

Hibernate 使用原生 Native SQL

Hibernate 是 DBA 最讨厌的框架之一, 在于 HQL 的滥用, 导致后期调优极度困难, 复杂的查询还是需要使用原生 SQL 来进行, 那么熟悉原生 SQL 调用就至关重要...

wenniuwuren 5004

Hibernate 原生SQL 与 (标量查询、字符串查询、实体查询)

hibernate是支持sql语句查询的,他称之为原生sql,因为他的写法并不是纯sql......     解决Hibernate原生SQL映射问题 在问答里和论坛中,经常看到有人问,怎样将使用本地SQL查询出来的结果映射为值对象的问题,这里就Hibernate中提供的方法做个结论。前提, 这里没有使用属性的延迟加载技术。 假设有个值对像,如下: Java代码 1. package test; 2. 3. pub

方逸涛的专栏 4300

PS-300B_PS-300B_PS300B_300B.zip

PS-300B_PS-300B_PS300B_300B.zip

上一篇: 十年MFC经历认识的Microsoft技术(zz)
下一篇: 利用MFC的CSocket类实现网络通信(zz)
afxid
博客等级 码龄23年 33粉丝 26原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值