探讨一下端口复用的问题............. 一台服务器,80端口已经被iis占用,我想写一个在服务器上运行的程序,能够对80口来的数据进行处理.使用了setsockopt后,在不启动IIS的情况下,程序能正常运行.先启动了IIS后,再运行咱的程序,用netstat命令可以看见有两个80端口,程序也运行了,但是程序却得不到任何数据,不知道为什么????????? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ////我的代码//////#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){ int nErr2; WSADATA WsaData; nErr2 = WSAStartup (0x0202, &WsaData); if (nErr2 == SOCKET_ERROR) { printf( "WSAStartup Failed\n"); return -1; } SOCKET hServerSocket_DS; SOCKET accept_DS; struct sockaddr_in HostAddr_DS; struct sockaddr_in ClientAddr_DS; int lPort = 80; char *buf1; char *raddr; char temp1[4]; char temp2[4]; char temp3[4]; char temp4[4]; int len=1000; int rlen = sizeof( ClientAddr_DS ); buf1 = ( char* )malloc(len); raddr = ( char* )malloc(17); ZeroMemory (&HostAddr_DS, sizeof (HostAddr_DS)); HostAddr_DS.sin_family = AF_INET; HostAddr_DS.sin_port = htons( lPort ); HostAddr_DS.sin_addr.s_addr = htonl( INADDR_ANY ); hServerSocket_DS = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if( hServerSocket_DS == INVALID_SOCKET) { printf("socket err!!!!"); return 0; } bool opt = true; int bread = setsockopt( hServerSocket_DS, SOL_SOCKET, SO_REUSEADDR, ( char* )&opt, sizeof(bool) ); if( bread == SOCKET_ERROR ) { printf( "err" ); } if( SOCKET_ERROR == bind( hServerSocket_DS, ( struct sockaddr * )( &( HostAddr_DS ) ), sizeof( SOCKADDR ) ) ) { printf("socket bind err!!!!"); return 0; } if( SOCKET_ERROR == listen( hServerSocket_DS, 5 ) ) { printf("listen err!!!"); return 0; } while( 1 ) { ZeroMemory( &ClientAddr_DS, sizeof( ClientAddr_DS ) ); ZeroMemory( buf1, len ); ZeroMemory( raddr, 17 ); memset( temp1, 0, 4 ); memset( temp2, 0, 4 ); memset( temp3, 0, 4 ); memset( temp4, 0, 4 ); ClientAddr_DS.sin_family = AF_INET; accept_DS = accept( hServerSocket_DS, ( struct sockaddr * )( &( ClientAddr_DS ) ), &rlen ); //在不开IIS的时候,程序是可以接受数据的..开了IIS之后,程序就一直停在这里了.. recv( accept_DS, buf1, len, 0 ); closesocket( accept_DS ); printf( buf1 ); } free( buf1 ); free( raddr );} SO_REUSEADDR可以用在以下四种情况下。 摘自《Unix网络编程》卷一 1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。 2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。 3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。 4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。 一般来说,你想再接收80端口的数据,必须用 Raw socket To: clane谢谢关注,有没有类似的例程啊.还没接触过raw socket http://www.xfocus.net/articles/200202/343.html 这个到网上去找了,google一下,大把都是 IP/Port 对是唯一的,SO_REUSE 是不能达到这个效果的你可以考虑使用 DLL 注入来完成,修改相应进程的导入表,用你的 DLL 接手数据处理 参考 Undocumented Windows 2000 Secrets 哪位朋友可以给一个使用CMemDC绘制位图的示例? vc++ 控件问题 VC 开机启动的问题 急等 对程序修改后重新编译为什么还是未修改前的状态 请问如何得到文件夹名?在线等待,谢谢! 按钮控件的鼠标跟随提示 ODBC记录集的问题 完成端口的问题? 300分!!!求交换机计费软件源程序。收到后将继续加分。 C语言 random和time的实现 数据查找 关于RecordSet 的RecordCount属性 多线程访问类中出现的非法访问
{
int nErr2;
WSADATA WsaData;
nErr2 = WSAStartup (0x0202, &WsaData);
if (nErr2 == SOCKET_ERROR)
{
printf( "WSAStartup Failed\n");
return -1;
} SOCKET hServerSocket_DS;
SOCKET accept_DS;
struct sockaddr_in HostAddr_DS;
struct sockaddr_in ClientAddr_DS;
int lPort = 80;
char *buf1;
char *raddr;
char temp1[4];
char temp2[4];
char temp3[4];
char temp4[4];
int len=1000;
int rlen = sizeof( ClientAddr_DS ); buf1 = ( char* )malloc(len);
raddr = ( char* )malloc(17); ZeroMemory (&HostAddr_DS, sizeof (HostAddr_DS));
HostAddr_DS.sin_family = AF_INET;
HostAddr_DS.sin_port = htons( lPort );
HostAddr_DS.sin_addr.s_addr = htonl( INADDR_ANY ); hServerSocket_DS = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if( hServerSocket_DS == INVALID_SOCKET)
{
printf("socket err!!!!");
return 0;
} bool opt = true;
int bread = setsockopt( hServerSocket_DS, SOL_SOCKET, SO_REUSEADDR, ( char* )&opt, sizeof(bool) );
if( bread == SOCKET_ERROR )
{
printf( "err" );
} if( SOCKET_ERROR == bind( hServerSocket_DS, ( struct sockaddr * )( &( HostAddr_DS ) ), sizeof( SOCKADDR ) ) )
{
printf("socket bind err!!!!");
return 0;
}
if( SOCKET_ERROR == listen( hServerSocket_DS, 5 ) )
{
printf("listen err!!!");
return 0;
}
while( 1 )
{
ZeroMemory( &ClientAddr_DS, sizeof( ClientAddr_DS ) );
ZeroMemory( buf1, len );
ZeroMemory( raddr, 17 );
memset( temp1, 0, 4 );
memset( temp2, 0, 4 );
memset( temp3, 0, 4 );
memset( temp4, 0, 4 );
ClientAddr_DS.sin_family = AF_INET;
accept_DS = accept( hServerSocket_DS, ( struct sockaddr * )( &( ClientAddr_DS ) ), &rlen ); //在不开IIS的时候,程序是可以接受数据的..开了IIS之后,程序就一直停在这里了.. recv( accept_DS, buf1, len, 0 );
closesocket( accept_DS );
printf( buf1 );
}
free( buf1 );
free( raddr );}
摘自《Unix网络编程》卷一
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。
谢谢关注,有没有类似的例程啊.还没接触过raw socket
你可以考虑使用 DLL 注入来完成,修改相应进程的导入表,用你的 DLL 接手数据处理