我想要不带控件的方法,winsock虽然简单,但是要带个ocx控件了,用netsata-an的方法也可以,但是貌似很容易失败。
有没有什么api直接可以获得一个空闲ip的?

解决方案 »

  1.   

    直接获得没有办法的话只有从1穷举了,关键是相关的api函数是什么?
      

  2.   

    我在winsock.dll的导出函数中找到了bind函数,可是不知道怎么使用,只是应该有个参数是让输入“127.0.0.1”的吧?另外还发现个函数getservbyport,不知道怎么用,竟然连返回值都没有,而且还是传值的。
    Private Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As SOCKADDR, ByVal namelen As Long) As Long
    Private Type SOCKADDR
        sin_family As Integer
        sin_port As Integer
        sin_addr As Long
        sin_zero As String * 8
    End TypePrivate Declare Sub getservbyport Lib "ws2_32.dll" (ByVal port As Long, ByVal proto As String)Private Sub Command1_Click()
        Dim l&, t As SOCKADDR
        t.sin_port = 677
        l = bind(1, t, 0)
        MsgBox l
    End Sub
      

  3.   

    那是个方法,可以没有返回值啊.
    就像Command1_Click()
      

  4.   

    那bind呢,这个返回-1表示绑定失败,返回0表示成功,可是我要测试127.0.0.1的80端口是否可以用,也就是本机80是否可用该怎么用这个函数?
      

  5.   

    下面这段代码是c++的,在vc6中编译可以,但是连接时出错
    #include <stdio.h>
    #include "winsock2.h"
    #include <windows.h>
    #pragma comment(lib, "wininet.lib")void main() {
      //----------------------
      // Initialize Winsock
      WSADATA wsaData;
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
      if (iResult != NO_ERROR)
        printf("Error at WSAStartup()\n");
      
      //----------------------
      // Create a SOCKET for listening for 
      // incoming connection requests
      SOCKET ListenSocket;
      ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return;
      }
      //----------------------
      // The sockaddr_in structure specifies the address family,
      // IP address, and port for the socket that is being bound.
      sockaddr_in service;
      service.sin_family = AF_INET;
      service.sin_addr.s_addr = inet_addr("127.0.0.1");
      service.sin_port = htons(27015);  //----------------------
      // Bind the socket.
      if (bind( ListenSocket, 
        (SOCKADDR*) &service, 
        sizeof(service)) == SOCKET_ERROR) {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        return;
      }
      
      WSACleanup();
      return;
    }
    http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx
      

  6.   

    你那段c++ 我经常用的啊....怎么会错呢...估计是选项的地方没配置对吧....需要在工具 选项里把需要引入的dll加入到link里的,不过我现在只有vc2005了,vc6没装,不知道vc6的ide的选项了