端口转发

2024-11-08

端口转发(精选3篇)

端口转发 篇1

摘要:SSH协议及相关工具软件是系统管理员非常常用的组件, 在日常网络应用中, 常常会碰到各种安全问题, 本文分析了SSH的端口转发机制, 讨论了在一些非安全环境下使用SSH端口转发对网络应用、个人隐私及商业信息进行加密保护的措施, 同时也讨论了如何利用SSH端口转发突破如防火墙及网络应用本身设置的限制以更加方便的使用网络服务。

关键词:SSH,端口,转发

1 概述

当使用SSH协议进行通信时, SSH协议会对所有SSH客户端与服务端之间的网络数据进行自动加解密, 从而实现安全通信。但使用者往往忽视了SSH协议的端口转发功能, 在端口转发模式下, 其他TCP端口的数据可以转由SSH链接自动进行加解密转发, 从而为其他TCP链接如Telnet、SMTP、LDAP提供安全加密传输通道, 避免了一些明文传输敏感信息泄露。如果其他网络端口被限制访问, 但SSH端口没有被限制, 也可以通过SSH端口转发进行TCP连接, 因此利用SSH端口转发不仅能够加密SSH客户端和服务器端的数据通信, 也可以解决由于防火墙限制而无法建立TCP连接的问题。

2 端口转发示例

假设有一台LDAP服务器只为本地应用提供访问服务, 如果需要临时从远程客户端连接到这台服务器, 就可以使用本地端口转发实现, 在远程客户端执行如下命令即可建立一个SSH本地端口转发。

上述命令假设服务器ip为172.16.100.123, 本地监听端口为8100, 此时即可将远程客户端的应用直接配置至本机8100端口, 实际通信过程如下。

远程客户端将数据发送至自己的8100端口, 而SSH客户端将8100端口接收的数据进行加密后转发至服务器SSH服务端, 服务器端的SSH服务端解密数据并将其转发至监听的389标准LDAP监听端口, 从服务器端相应的数据沿原路以相反流程传输。整个流程中客户端直接连接本地监听端口, 转由SSH端口转发完成加密、转发、解密的通信过程, 并没有直接连接服务器端。

由于整个端口转发通信过程基于SSH连接, 因此必须保持SSH连接以使端口转发生效, 如果SSH连接断开, 显而易见, 整个通信链路也随之失效。另外只能在创建SSH连接时同时建立端口转发, 对已经存在的SSH连接无法额外创建端口转发。另外还可以使用SSH提供的Gateway Ports关键字将已经创建的本地端口转发共享给其他客户端。

上面讨论了SSH的本地端口转发, 假如由于防火墙的原因不能使用SSH直接从客户端连接到服务器, 但允许服务器到客户端的反向SSH连接, 那么可以使用远程端口转发。假设通信拓扑如上例, 那么在服务器端可执行如下命令。

上述命令假设客户端ip为172.16.100.234, 客户机监听端口为8100。实际通信如下。

客户端数据发送至自己的8100端口, 本机SSH服务端加密8100端口接收的数据后转发至服务器端SSH客户端, SSH客户端接收数据并解密, 然后将其转发至监听的389标准LDAP监听端口, 最后将服务器端的响应数据沿原路以相反流程传输。

如何区分本地转发及远程转发?首先要明确SSH端口转发需要在SSH连接的基础上实现应用连接, SSH连接及应用连接都是有方向性的, 如果SSH连接和应用连接方向一致则是本地转发, 反之则是远程转发。

3 其他类型转发示例

例如在公共的不安全的网络环境中, 可以使用SSH动态转发对网页浏览进行保护。如下面的动态转发命令格式。

假设8100为本地对外访问的端口号, 12.34.56.78为我们有权限进行连接的远程SSH服务器, 上述命令利用SSH创建了SOCKS代理服务, 我们可以在浏览器上将localhost:8100设置为正常的SOCKS代理使用。在SSH客户端和SSH服务器端的通信获得了加解密保护, 但要注意SSH协议也仅能对此段连接进行保护, 对SSH服务器端到目标网站的连接是无法保证安全的。

例如系统管理员经常会远程登录到如Linux、Unix、Solaris等服务器上并在其上以GUI方式进行程序开发或维护, 一般可以使用VNC协议及其工具, 本文讨论使用SSH结合XWindow实现X协议转发的方法。

使用XWindows需要X客户端及X服务器端, 如上文所述, X客户端即为远程Linux、Unix、Solaris服务器, X服务器端则是发起访问的本地机器, 一般正常情况下, 将X客户端的X窗口显示在X服务器端需要在X客户端指定X服务器端的位置, 如下列命令所示, 然后直接运行X应用即可。

如果远程服务器前端增加了防火墙并且不允许X协议通过, 此时可以使用SSH端口转发解决, 可在本地机器即X服务器端发起如下列命令所示的SSH连接, 在创建SSH连接的同时建立X转发并对X通讯数据进行加密。

连接建立后即可运行远程X应用, 建议不要改变建立X转发时系统自动设置的DISPLAY环境变量如localhost:10.0, 假如本地机器为Windows, 可以选择XMing作为X服务器端, SSH客户端可以选择如Pu TTY、Cygwin均可。

4 结语

本文讨论了利用SSH实现本地端口转发、远程端口转发、动态端口转发及X转发, 基本原理为在SSH连接基础上转发TCP连接以解决数据加密和突破限制。每种端口转发适合于不同的应用场景, 对于周知端口的应用可以使用本地或远程端口转发, 如果需要实现SOCKS代理加密则可以使用动态端口转发, 对于X应用显而易见可以使用X转发, 读者可以根据实际情况做不同的尝试。

参考文献

[1]巴雷特 (美) .西尔弗曼 (美) .SSH权威指南 (O'Reilly原版) [J].中国电力出版社, 2003.

端口转发 篇2

这种攻击方式不知有人研究过没,我在网上没有看到过,最近一段时间花费了点心思,把这种攻击技术稍微钻研了下,希望能对安全技术爱好者又提供一个奠基石,但不希望大家用他来做网络破坏,因为后果很严重,网管很生气,因为他找不到攻击源,对于防护这种攻击目前没有很好的解决办法,所以大家三思而后行。

废话说了不少,进入正题。起初对于这种攻击的发现是来源早期对ARP协议的学习与研究,在当时发现发送特定格式的ARP数据包会对网络造成一定影响,假如我是B机器,捕获到C机器发向A的ARP返回包。

在B机器上使用SNIFFER PRO 捕获后,进行数据包重放,就是说B机器上发出了源MAC 为C机器的这样的数据包,交换机时收到这样连续不段的数据包时(发送的数量与攻击的效果有很大关系)C机器突然就与网络中的其他机器失去联系,网络中的其他机器也访问不到C机器,根据抓包发现C机器的数据包是能够发送出去的,只是没有收到回应包,问题出在那里?。

有想法的人肯定会想到数据包被交换机转发到B机器上来了,为了证实我们的想法,在B机器上抓包发现,有很多数据包是其他IP对C机器的回应包。很多人会不明白为什么会这样那。大家知道交换机和HUB的区别,交换机不对数据包进行广播。

他工作的模式是:A机器--->B机器的数据包 C机器是接收不到的,应为交换机内部有转发列表(ACM), AMC表的作用是建立MAC地址与端口的对应关系,一个端口可以和很多MAC地址建立对应关系。

(在802.1x下好像只能建立一个),这看上去没什么问题,问题是出在ACM是实时动态更新的, 说到这里在看上面的问题就清楚了,原本C机器发送数据包到A没有问题,C机器的MAC在3口建立了临时的对应关系,A机器收到后如果再与C机器进行通讯,交换机会把数据包直接转向了3口,他们之间的数据连接就会成功。

在B机器捕获到这个数据包时进行连续重放,刚才也说了是从B机器上发送源地址为C机器MAC的数据包,数据包通过交换机时会改变C机器MAC与3口的对应关系,交换机发现这个数据包的源MAC地址是从交换机的2口发送。

所以会建立C机器的MAC 与2号端口建立ACM表的对应关系,A机器再发向C机器的数据包,全被交换机转到2号端口B机器上面,所有就形成了C机器的断网现象,大家现在应该明白了吧,上面是我自己的理解,可能有些地方解释的有问题,希望大家提出。

下面有人会说C机器也在不断的发包,也会改变ACM表上C机器MAC与2号端口的对应关系,上面我也说过,这就要看B机器的重放数据包的数量了,经过我测试发现在B机器重放每秒500-1000个数据包的同时,

C机器应经与机器不能通讯或通讯非常非常的慢,有意思的是在C机器上能PING 的通其他机器,这让C机器挺郁闷吧,而且C机器收不到任何攻击数据包,应为是C对应A机器的数据包,没有进行广播,如数据包的数量在1万左右,C机器收不到任何信息。

你又会说为什么不进行数据包广播那,应为数据包进行广播的话,对交换机影响很大,会对其他机器造成影响,而且容易让别人发现这种数据包,(虽然他不查看交换机MAC表是找不到你,但是就怕他看),如果你网络很大,广播对你自己利用说也会造成影响。

所以我们要把数据包做成定向发送,找个傀儡机喽,在上面A就是我们的傀儡机了,假如还有D机器的话,在D机器上抓包是发现不了这种攻击的,是不是很可怕,下面还有更可怕的那。

大家又要开动脑筋了,既然可以对单台机器发动攻击,也可以对网关发动攻击,对网关发送攻击会出现什么后果那,就是大家都不能和网关进行通讯,网络全部断掉(包括你自己),前提只需在B机器上发送源地址为网关的数据包。

我们已经说了广播包是最不可取的,那我们就要找个傀儡机器,还找机器A吗,不行啦,因为是定向包B机器和A机器在同一交换机上面,所能更改的也只是这台交换机的ACM表,也只是对这个交换机的下面的机器有影响,我们怎么突破范围那,上面说了广播可以,但是又是最不可行的方法,怎么办?

放心,聪明人总会有办法的,在这个时候傀儡机器的作用显现出来了,用专业术语说下,从B机器发送源地址为网关MAC的数据包,它所经过的交换机都会被更改与网关ACM的对应关系。

也就是说傀儡机有多远我们攻击的交换机就有多远,所以说选择傀儡机所在网络拓扑的位置很重要,他决定了我们攻击交换机的范围。如果我想让全网掉线的话,我会选择主干交换下面的机器做傀儡机器,是不是我很坏。

大家都看懂了吧,也可能会说这种攻击很完美了,我反对,因为大家想,这种攻击如只局限于ARP协议是很容易被封杀的,因为测试过程中这种攻击很多ARP防火墙是不允许的,然后我只好在想办法啦,大家又要动脑筋了。

我们在回到原理上,是数据包的那个部分对交换机ACM造成影响,是DLC链路层,在数据包中的头十四个字节,这十四个字节包含了数据的源MAC地址6个字节,目的MAC地址6个字节 协议类型2个字节。

我们想一想还有什么数据包包含这十四个字节那,很多啦例如有TCP /UDP /ICMP等,我们马上操刀开练,在B机器上发送源地址为C机器MAC的UDP数据包,发送到A机器,哈哈,TCP/ICMP等效果一样,后来发现高兴的太早了,彩影和巡路做的ARP防火墙还是会针对IP欺骗做过滤。

★ GRE词汇量需求和分数对应关系介绍

★ 去函和复函对应范文

★ 网络交换机?什么是网络交换机

★ 元宵节对应的诗句

★ 讲述生活趣事

★ 讲述因为信任作文

★ 有关于讲述《狂人日记》

★ 关系型数据库表结构的两个设计技巧

★ 《9以内数量对应》说课稿

端口转发 篇3

内网转发器与多个客户分别建立多个连接通道, 要求有一种高效处理并发连接的模式, 多线程模型处理并发的方式是:为每一个连接创建一个线程, 让这个线程专门处理该连接的数据I/O。该模型在连接数较多时, 会出现以下问题: (1) 大量客户连接的建立, 关闭, 导致线程不断创建, 销毁, 系统资源开销很大。 (2) 连接太多导致大量线程同时运行, 内核要花费较多时间用于线程间的切换, 而每个线程的I/O处理速度则大幅度下降。采用线程池可以解决线程过多的问题。预先创建好一定数量的线程置入线程池, 需要时从线程池中取出闲置线程使用, 省去创建线程的时间, 线程结束运行后, 无需销毁, 再次放回线程池备用。

简单的线程池模型处理套接字I/O时, 在某些场景中仍有线程资源利用不够充分的问题。例如, 当某个连接建立后, 该连接上请求和应答之间有较长的时间间隔。或者一次请求数据因网络原因分多次传入, 只要该连接未断开, 会话 (session) 未结束, 线程只能等待会话完成, 不能放回到线程池再利用。因此, 效率更高的线程模型应该把线程服务的最小单元由一个session分解为单次数据I/O。只要一次I/O结束, 线程的任务即完成, 可以交回线程池备用。这样, 每一个线程的利用率大幅度提高了。微软公司在Winsock2平台上中提供了一个运行于系统内核级别的完成端口模型 (Completion Port) , 实现了上述高效率的多线程I/O管理机制。内网转发器将建立一个基于完成端口模型的数据转发系统。

2 完成端口和完成例程

2.1 完成端口和重叠I/O

完成端口模型有如下几个特点:

(1) 重叠I/O, 重叠的含义是不同套接字上数据的接收和发送可以交给内核同时进行, 使用WSARecv, WSASend函数完成, 以WSARecv为例:

其中第6个参数lp Overlapped是一个称为“重叠结构”的参数, 该参数若不为NULL, 则表明该函数以“重叠”的方式从套接字s上接收数据。其含义是, WSARecv调用后立即返回, 并不阻塞等待数据接收完成, 而把接收任务交给系统内核, 系统一旦收到数据, 则将数据拷贝到由第二个参数lp Buffers指明的一个数据缓冲区, 然后以一定方式通知调用者:数据接收已经完成, 调用者接到通知后, 就可以处理缓冲区里的数据了。可以看出:WSARecv实际上只发出接收数据的指令。调用后立即返回, 再次调用, 服务于其他套接字, 因此可以在短时间内处理大量的并发请求。

(2) I/O完成通知队列和工作线程池。系统处理数据I/O完成以后, 把I/O完成包按完成的时间顺序, 放入一个通知队列。这个队列由完成端口来管理。完成端口创建若干个工作线程 (Worker Thread) , 所有的工作线程均以调用函数Get Queued Completion Status开始, 该函数查询通知队列, 取出队列中的完成包, 进行数据处理。若队列中为空, 则该函数阻塞不返回, 工作线程进入挂起 (Suspend) 状态, 直到队列中完成包的到来。多个工作线程挂起等待完成包时, 完成端口规定, 由最后一个进入等待的线程优先取得完成包。

建立完成端口模型的过程并不复杂, 主要流程是:

(1) 建立完成端口。第一次调用函数:

(2) 建立连接套接字。

本程序中, 建立完成端口的方法是:

(3) 把套接字绑定到完成端口, 仍然调用函数Create Io Comp letion Port。

第一个参数设为要绑定的套接字m_sock, 第二个参数为建立好的完成端口iocpport, 第三个参数也同样设为m_sock。

(4) 在工作线程或者其他线程里, 调用WSARecv或WSASend投递I/O请求。

(5) 在多个工作线程里, 调用Get Queued Completion Status查询完成事件通知队列, 取出完成包, 进行数据处理。

2.2 完成例程模型

完成例程是另一种管理重叠I/O的机制, 其数据接收和发送也是采用重叠I/O函数WSARecv, WSASend, 与完成端口不同的是, 在I/O请求完成以后, 系统将自动调用一个回调函数来处理完成包里的数据。回调函数由用户自己编写, 在WSARecv函数的第七个参数lp Completion Routine指明该回调函数的函数指针。完成例程处理多连接的性能比完成端口稍差。内网转发器以完成例程机制来管理用户数据。

3 内网转发器系统设计

3.1 主线程

内网转发器由主线程、数个完成端口工作者线程和用户管理线程构成。程序流程如图1所示。

主线程的工作流程是: (1) 创建完成端口, 数个工作者线程。 (2) 创建用户管理线程。 (3) 开始循环查找外网用户发送的IP地址邮件。 (4) 取出邮件中的IP地址, 与外网用户建立连接, 建立一个新的用户对象加入用户对象集。 (5) 以事件通知唤醒用户管理线程去处理新用户。 (6) 等待用户线程处理完毕通知。 (7) 继续循环查找用户IP地址邮件。主线程代码如下:

3.2 重叠I/O数据结构

函数WSARecv () 调用时, 都要传递一个重要的“重叠结构” (Overlapped) 参数, 它给每一个I/O操作分配ID号作为标志以区分不同的I/O, 在I/O操作被系统异步完成后, 系统又把这个结构的指针放入I/O完成通知队列, 重叠数据结构除第一个成员必须为OVERLAPPED结构以外, 还可以添加其他成员, 因此该数据结构可以作为程序和系统之间关于某个I/O操作的共享数据区。本系统的重叠结构类型设计如下:

该数据结构又称为单IO数据结构, 服务于一次I/O操作。

3.3 工作线程

数据转发工作由完成端口工作线程进行。工作线程代码如下:

工作线程中, PostSend函数投递发送数据请求, PostRecv函数用于投递接收数据请求:

工作线程循环调用函数GetQueuedCompletionStatus查询完成通知队列, 函数第一个参数指明要查询的完成端口, 当函数返回时, 说明有I/O操作已经完成, 系统把已接收或者已发送的字节数传递给第二个参数byteTran, 套接字句柄传递给第三个参数hSocket, 与该操作关联的单IO结构指针传递给第4个参数pIO。

工作线程的数据转发流程固定为在单IO结构中的套接字m_sock1上接收数据, m_sock2上发送数据。对于请求数据流, 由连接外网客户的Socket (简称外连接Socket) 接收, 由连接内网服务器的Socket (简称内连接Socket) 发送, 共用一个单IO结构pIO, m_sock1, m_sock2应赋值为:

而对于应答数据流, 是由内连接Socket接收, 再交给外连接SOCKET发送, 共用一个单IO结构pIO2。因此pIO2中m_sock1, m_sock2的赋值要变为:

为了确保转发的网络数据包不乱序, 工作线程采取的转发策略是:一次接收的数据必须全部正确发送完毕后, 再进行下一次的数据接收, 开始接收数据之前, pIO中的byterecv和bytesend全部初始化为0, 数据接收完成后, 要将pIO->byterecv=byteTran, 所以可以由byterecv是否为0来判断IO操作是接收还是发送。

单IO结构中m_sock1, m_sock2的建立时机并不相同, 建立外连接要在转发工作开始之前, 先由外网转发器发出建立外连接指令, 再由内网转发器在处理用户指令的回调函数UserRoutine中, 循环调用server_connect_remote (USER*puser) 建立多个外连接Socket:

函数connect_delay在新创建的套接字sockets1上建立与外网用户的连接。连接成功后, 构建一个单IO结构p IO, p IO->m_sock1赋值为套接字sockets1, 把m_sock1绑定到完成端口上, 最后调用Post Recv函数投递一个接收数据请求, 让系统等待由sockets1传来的请求数据。那么, 对内网服务器的连接何时建立?当外网请求数据没有到来时, 如果建立与内网服务器的连接, 这时由于没有数据交互, 连接往往会被服务器关闭而失效。因此, 内连接的建立时机只能是在外网的请求数据第一次到来之后发起。工作线程中, 当p IO->m_sock1收到数据, 在向p IO->m_sock2发送数据之前, 先判断p IO->m_sock2是否为NULL值, 若是, 表明与内网服务器的连接尚未建立, 则首先在p IO->m_sock2上与内网建立连接, 再发送请求数据。

与内网服务器建立连接的同时, 也要马上准备接收内网服务器传回的应答数据, 构建新的单IO结构p IO2, 将p IO2->m_sock1 (和p IO->m_sock2是同一个套接字, 连接内网) 绑定到完成端口, 对p IO2->m_sock1调用Post Recv, 投递接收应答数据的请求。

3.4 用户管理线程

为了把转发功能和用户管理分开, 使两者的数据传输互不影响, 用户管理模块由User Thread线程和回调函数User Routine组成, 基于“完成例程”的重叠I/O模型构建。代码如下:

回调函数用于控制命令信息处理, 代码如下:

用户管理线程由两个循环构成, 内循环不断调用WSAWait For Multiple Events检测是否有事件通知, 检测的通知事件包括两个, 重叠I/O完成通知, 该事件通知由系统传递;函数第二个参数指出的用户设定的事件数组。事件数组中只有一个事件p M->acptevent3, 该事件用于通知新用户到达, 由主线程收到新用户时触发。当该函数返回时, 根据返回值判断事件类型;如果返回值为WAIT_IO_COMPLETION, 则为重叠I/O完成通知事件。线程运行将中断, 由系统转去调用回调函数User Routine处理收到的用户命令信息。User Routine调用结束, 系统返回事件通知循环。如果函数返回值不等于WAIT_IO_COMPLETION, 则为acptevent3事件通知, 程序跳出内循环到用户处理循环, 构建一个PER_IO_DATA对象, 将操作类型置为p IO->optype=ONULL, 表明该对象只用于接收命令消息, 设p IO->m_sock1=p M->cur_loguser->ctrlsocket, 后者为主线程中与外网用户的第一个连接, 在p IO->m_sock1上投递接收命令消息请求, 注意此处p IO->m_sock1没有绑定到完成端口, 不由工作线程处理。Post Recv的第三个参数p M->User Routine, 指明WSARecv完成后的回调函数。

4 完成端口性能优化

4.1 对象池技术

重叠I/O模型, 每建立一个套接字连接, 都要在内存创建相应的I/O结构对象, 作为WSASend或WSARecv的参数, 当连接关闭时, I/O对象随之被销毁, 系统创建释放对象需要开销, 而且堆区内存反复的分配释放, 会使内存中出现大量的内存碎片, 随着时间的流逝, 程序运行会越来越慢。可以采用构建对象池的方法解决上述问题, 需要时从池中取出一个空闲对象, 用完后再放到对象容器中以供下一次再利用。省却了内存分配释放的系统开销;放回对象池的对象在内存中的位置并没有变化, 仅仅是内容被重置, 不会产生内存碎片。为此设计了一个通用的对象池模版类, 代码如下:

该类有一个deque类型的stl容器freeque保存闲置对象指针;deque容器的优势是, 在容器的头尾插入和删除元素的速度比较快。成员函数Get Unit () 调用front () 从freeque首部取得头部闲置对象指针, 取出后, 用pop_front () 函数将该指针弹出, 如果没有闲置对象, 则在堆区分配一个新对象返回。Free Unit (T*p) 释放对象, 把对象指针p从freeque尾部加入, 两个操作均要用到临界区保护, 以确保其他线程互斥访问容器freeque。另外, 模版类实例化的类要实现自己的成员函数Re Set () 用来重置对象。

程序中的IO结构对象池可以这样构建:

从获取IOPool中取得一个闲置的PER_IO_DATA:

4.2 零字节投递防止内存溢出

投递WSARecv请求时, WSARecv指定的缓冲区会被锁定到系统非分页内存以等待数据, 最小为4k, 转发系统要为每个客户预先投递数十个WSARecv来等待请求, 客户较多时就会有大量的非分页内存被锁定, 系统非分页内存的大小是有限的, 消耗过多, I/O操作往往会出现“WSAENOBUFS”的错误。解决的办法是WSARecv投递一个0字节长度的缓冲区。这样就不会有内存被锁定了, 当系统收到数据, 会发出一个通知到完成端口, 实际并没有接收到数据。可以根据这个通知, 再次投递非0字节缓冲的WSARecv请求, 真正开始接收数据。Post Recv函数第二个参数为缓冲区长度, 设为0, 投递0字节请求。相应的在工作线程中, 函数Get Queued Completion Status (iocpport, &byte Tran…) 第2个参数byte Tran返回0字节, 但是, 当套接字连接断开时, byte Tran也会返回0, 可以通过判断p IO->wsa Buf.len是否为0来区分这两种情况。

5 结语

只要是基于TCP协议的服务均可经本系统转发。现以外网某主机连接内网的几个服务为例说明:

(1) Http服务。局域网内某主机10.10.1.32有Web服务器, 在该主机上运行内网转发器;外网主机地址58.59.3.100, 启动外网转发器, 监听两个端口6000, 7000。设定转发目标为10.10.1.32:80, 当提示“与内网已经建立!”时, 开启浏览器, 地址栏输入:“http://127.0.0.1:7000/”, 即可连入内网Web服务器。

(2) Https服务。Https也是建立在TCP协议上。局域网内某主机10.10.1.33运行Remotely Anywhere, 端口2000。外网转发器上设定转发目标为10.10.1.33:2000。浏览器地址栏输入:“https://127.0.0.1:7000”, 可连入内网Remotely Anywhere服务。

(3) SQLserver服务器运行于局域网10.10.1.34, 端口1433。外网转发器设定转发目标为10.10.1.34:1433, 外网数据库客户端修改连接字串中的Data Source=“127.0.0.1, 7000”可连接内网SQLserver。

参考文献

[1]Jones A, Ohlund J.Windows网络编程[M].北京:清华大学出版社, 2002.

[2]吴永明, 何迪.基于完成端口的服务器底层通信模块设计[J].信息技术, 2007, Vol3.

上一篇:华丽蜕变下一篇:既有砌体结构