请问怎样通过api函数获得一个空闲的端口号?

无·法 2009-09-22 11:15:36
我想要不带控件的方法,winsock虽然简单,但是要带个ocx控件了,用netsata-an的方法也可以,但是貌似很容易失败。
有没有什么api直接可以获得一个空闲ip的?
...全文
205 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的问题跟你的c++貌似不是一回事啊
  • 打赏
  • 举报
回复
你那段c++ 我经常用的啊....怎么会错呢...

估计是选项的地方没配置对吧....需要在工具 选项里把需要引入的dll加入到link里的,不过我现在只有vc2005了,vc6没装,不知道vc6的ide的选项了
无·法 2009-11-05
  • 打赏
  • 举报
回复
最后一次up
无·法 2009-09-29
  • 打赏
  • 举报
回复
下面这段代码是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
无·法 2009-09-29
  • 打赏
  • 举报
回复
看样子没有办法了?
贝隆 2009-09-23
  • 打赏
  • 举报
回复
关注
无·法 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 king06 的回复:]
引用 3 楼 sysdzw 的回复:
我在winsock.dll的导出函数中找到了bind函数,可是不知道怎么使用,只是应该有个参数是让输入“127.0.0.1”的吧?另外还发现个函数getservbyport,不知道怎么用,竟然连返回值都没有,而且还是传值的。
DeclareSub getservbyport Lib"ws2_32.dll" (ByVal portAsLong, ByVal protoAsString)
那是个方法,可以没有返回值啊.
就像Command1_Click()
[/Quote]
那bind呢,这个返回-1表示绑定失败,返回0表示成功,可是我要测试127.0.0.1的80端口是否可以用,也就是本机80是否可用该怎么用这个函数?
king06 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sysdzw 的回复:]
我在winsock.dll的导出函数中找到了bind函数,可是不知道怎么使用,只是应该有个参数是让输入“127.0.0.1”的吧?另外还发现个函数getservbyport,不知道怎么用,竟然连返回值都没有,而且还是传值的。
Declare Sub getservbyport Lib"ws2_32.dll" (ByVal portAsLong, ByVal protoAsString)[/Quote]
那是个方法,可以没有返回值啊.
就像Command1_Click()
无·法 2009-09-23
  • 打赏
  • 举报
回复
我在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 Type

Private 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
无·法 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
穷举。
[/Quote]
直接获得没有办法的话只有从1穷举了,关键是相关的api函数是什么?
threenewbee 2009-09-22
  • 打赏
  • 举报
回复
穷举。

7,786

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧