在C#中实现Socket端口复用

一、什么是端口复用:

因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。

二、我们如何实现Socket端口复用:

其实我们要实现端口复用很简单,我们只要使用SetSocketOption函数设置Socket选项就可以了。MSDN是这样解释的:

Socket 选项确定当前 Socket 的行为。对于具有 Boolean 数据类型的选项,指定非零值可启用该选项,指定零值可禁用该选项。对于具有整数数据类型的选项,指定适当的值。Socket 选项按照协议支持程度来分组。

我们来看看这个函数是怎么用的:

public void SetSocketOption (
SocketOptionLevel optionLevel,
SocketOptionName optionName,
int optionValue
)

参数

optionLevel

SocketOptionLevel 值之一。

optionName

SocketOptionName 值之一。

optionValue

该选项的值。

以上参数大家可以去看看MSDN。我这里就不多讲了。

在这里我们optionLevel 参数传SocketOptionLevel.Socket;optionName参数传SocketOptionName.ReuseAddress;optionValue参传一个非零值,我传的是True,如果要禁用的话,就传False。

如:

socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

具体我们看看下面的代码:

我们首先建立第一个Socket:

Socket socket1;
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 20000);
socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket1.Bind(localEP);

再建立第二个Socket:

Socket socket2
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 20000);
socket2= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//请注意这一句。ReuseAddress选项设置为True将允许将套接字绑定到已在使用中的地址。
socket2.Bind(localEP);

这样Socket1和Socket2便绑定在同一个端口上了。

例程源代码我上传到我的资源里面大家可以到http://www.cnblogs.com/Files/wzd24/28135640620.rar去下载。

时间: 2024-11-03 09:32:59

在C#中实现Socket端口复用的相关文章

wcf httpwebrequest 端口复用

问题描述 我最近也需要实现一个功能:1)一个客户端(192.168.0.5),10个服务端(提供A接口.B接口)如下:192.168.0.1-5685192.168.0.2-5685192.168.0.3-5685.......2)在客户端通过httpwebrequest循环遍历向10个服务端调用接口,先调用A接口,再调用B接口:实现思路:1.[客户端]向不同的服务发送http请求由不同的httpwebquest实现,向同一服务发送多个请求后关闭连接.2.[服务端]未采用配置文件方式加载,设置S

php中关于socket的系列函数总结

  本文列举了所有关于PHP语言中使用socket相关服务的一些函数.注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释(分号): 代码如下: extension=php_sockets.dll 如果你无法去掉注释,那么请使用下面的代码来加载扩展库: 代码如下: if(!extension_loaded('sockets')){ if(strtoupper(substr(PHP_OS,3))=="WIN"){ d

Ruby中的Socket编程简单入门

  这篇文章主要介绍了Ruby中的Socket编程简单入门,是Ruby网络编程学习中的基础知识,需要的朋友可以参考下 Ruby提供了两个访问级别的网络服务.在一个较低的水平,可以访问底层的操作系统,它可以实现面向连接和无连接协议的客户端和服务器支持基本的socket. Ruby也具有程序库,提供更高级别的访问特定的应用程序级的网络协议,如FTP,HTTP等. 这篇教程介绍 Ruby Socket编程概念及讲解一个简单的实例. 什么是Sockets? 套接字是一个双向通信信道的端点.socket能

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序.  餐前甜点  Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对

教你轻松读懂Java中的Socket编程

餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作.Read操作用来从IO操作对象读取数据,并将数据传递给用户进程.Write操作用来将用户进程中的数据传递(写入)到IO操作对象. 当所有的Read和Write操作结束之后,用户进程需要调用Close来通知系统其完成对

简单实现Http代理工具--端口复用与QQ代理

话说上一次做完http代理工具后,没有测试QQ代理,回家试了一下,做了一下简单补充,并测试通过.   上次的文章提到,所有公司的服务器端口都封了,只剩下几个通讯的已经正在便用的. 于是,在本地XP下试了一下端口劫持,也称端口复用.抢占80端口. 关键代码就一句:tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 在本地实现抢占80端口后,所有的http

C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信_C#教程

首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

c#-C# 如何实现快速扫描局域网中开放特定端口的目标主机

问题描述 C# 如何实现快速扫描局域网中开放特定端口的目标主机 如题,大概是类似于飞秋启动时那个获取好友列表那种的,首先要考虑效率 解决方案 可以考虑用p2p协议. 也就是说用暴力扫描全网的电脑来进行节点机器的发现过程. 如果发现一个节点,那么就可以从节点中得到目前的节点网络拓扑图状况,并提交加入网络的请求. 这样的速度是飞快的... 每个节点功能相同,兼作服务器和客户机. 节点的管理有些象路由的管理,信息在网络中象水的波纹一样传播,直到"能量"耗尽. 解决方案二: test 解决方案

在silverlight中利用socket发送图片或文件

silverlight中的socket通讯支持,让sl开发基于web的聊天工具成为了可能,后来OpenFileDialog,SaveFileDialog的出现,更使得边聊天边传送图片(文件)得以实现,最新的SL4中又加入了摄像头支持,也许不久真的可以用silverlight开发出功能强大的视频聊天系统,目前唯一还没有解决的是p2p问题,根据sl3的sdk文档所述:    Socket 类为网络通信提供了一组方法和属性.Socket 类允许您使用 ProtocolType 枚举中所列出的任何一种通