一台服务器,80端口已经被iis占用,我想写一个在服务器上运行的程序,能够对80口来的数据进行处理.使用了setsockopt后,在不启动IIS的情况下,程序能正常运行.先启动了IIS后,再运行咱的程序,用netstat命令可以看见有两个80端口,程序也运行了,但是程序却得不到任何数据,不知道为什么?????????

解决方案 »

  1.   

    ////我的代码//////#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 );}
      

  2.   

    SO_REUSEADDR可以用在以下四种情况下。 
     摘自《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。
      

  3.   

    一般来说,你想再接收80端口的数据,必须用 Raw socket
      

  4.   

    To: clane
    谢谢关注,有没有类似的例程啊.还没接触过raw socket
      

  5.   

    http://www.xfocus.net/articles/200202/343.html
      

  6.   

    这个到网上去找了,google一下,大把都是
      

  7.   

    IP/Port 对是唯一的,SO_REUSE 是不能达到这个效果的
    你可以考虑使用 DLL 注入来完成,修改相应进程的导入表,用你的 DLL 接手数据处理
      

  8.   

    参考 Undocumented Windows 2000 Secrets