相关文章推荐
文质彬彬的领结  ·  How to find entire ...·  1 年前    · 
玩手机的啄木鸟  ·  使用Ant ...·  1 年前    · 
从容的青蛙  ·  hive on spark hql ...·  1 年前    · 
function ScanTCPPort(ipstr : string; Port : DWORD) : Boolean;
var
ClientSocket : TIdTCPClient;
begin

try
ClientSocket := TIdTCPClient.Create(self);
try
ClientSocket.Host := ipstr; //ipstr := '127.0.0.1';
ClientSocket.Port := Port;
ClientSocket.Connect;
ClientSocket.Disconnect;

//the port is open, and add your code as below.
//...

Result := True;
except
; //do nothing; --- means the port is not open.
Result := False;
end;
finally
ClientSocket.Free;
end;

end;
2. Delphi的版本变来变去的, D6的时候用TServerSocket, 但D7就已经不同了. 所以还是用Win32 Socket API比较可靠: function ScanTCPPort(ipstr : string; Port: DWORD): Boolean;
var
option: DWORD;
TcpSock: TSocket;
InAddr: TSockAddrIn;
IP : DWORD;
begin
result := False;

//convert IP string to ulong
IP := ntohl(inet_addr(PChar(ipstr)));
if IP = INADDR_NONE then  //invalid IP address!
exit;

// Create/open a socket (stream, not datagram)
TcpSock := socket(AF_INET, SOCK_STREAM, 0);
if TcpSock = INVALID_SOCKET then  //socket error
exit;

try
// Set socket options
option := 0;
setsockopt(TcpSock, SOL_SOCKET, SO_KEEPALIVE, @option, sizeof(option));
option := 1;
setsockopt(TcpSock, SOL_SOCKET, SO_DONTLINGER, @option, sizeof(option));

//if winsock 1.1, including the next sentence, otherwise, skip it.
setsockopt(TcpSock, IPPROTO_TCP, TCP_NODELAY, @option, sizeof(option));

//Initialize address structure
ZeroMemory(@InAddr, sizeof(InAddr));
InAddr.sin_family := AF_INET;
InAddr.sin_addr.S_addr := ntohl(IP);
InAddr.sin_port := htons(Port);
//Try to connect
Result := connect(TcpSock, InAddr, sizeof(InAddr)) = 0;
finally
//Close the socket
closesocket(TcpSock);
end;
end;
3. 是使用的时候, 最好结合多线程一起使用, 不然如何检测一个ip的端口范围从1~65535的话, 有的等了. 1. 简单的就是利用Indy的控件, TIdTCPClient. --- Primer说的是, 连的上就是开, 连不上就是关. 一个简单的例子, (Delphi 7)代码:function ScanTCPPort(ipstr : string; Port : DWORD) : Boolean;var  ClientSocket : TIdTCPClient;begin  try
基于 Delphi 的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string ); WSAData: TWSAData; M Socket : T Socket ; SockAddrIn: TSockAddrIn; RetVal, OptVal, i: Integer; MacAddr: array[0..5] of Byte; MagicData: array[0..101] of Byte; Position: Longint; begin if Length(SAddr) 17 then Abort; for i := 1 to Length(SAddr) do if i in [3, 6, 9, 12, 15] then if SAddr[i] '-' then Abort; for i := 0 to High(MacAddr) do begin if Pos('-', SAddr) > 0 then MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1)) MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr); //Delete 是删除一个 字符串中的 某部分字符 //Delete(str, index, count) // str, //被删除的字符串 // index, //从第几个字符开始删除 // count //删除几个 //Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2、3. //Pos(a,b); 取出子串a,在父串b中第一次出现的位置; //Pos'b','abcd'); 返回结果是:2 Delete(SAddr, 1, Pos('-', SAddr)); except //application.MessageBox('网卡地址错误','警告',MB_ICONWARING); 错误:MB_ICONWARING application.MessageBox('网卡地址错误', '警告', MB_ICONWARNING); exit; CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup'); M Socket := socket (AF_INET, SOCK_DGRAM, IP PROTO_ IP ); if M Socket = INVALID_ SOCKET then CheckWinSockResult(M Socket , ' socket '); OptVal := 1; CheckWinSockResult(setsockopt(M Socket , SOL_ SOCKET , SO_BROADCAST, PChar(@OptVal), SizeOf(OptVal)), 'setsockopt'); FillChar(MagicData, SizeOf(MagicData), $FF); Position := LEN_PHYSADDR; while Position < SizeOf(MagicData) do begin Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR); Inc(Position, LEN_PHYSADDR); SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST); RetVal := sendto(M Socket , MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn)); if RetVal = SOCKET _ERROR then CheckWinSockResult(RetVal, 'sendto'); CheckWinSockResult(close socket (M Socket ), 'close socket '); CheckWinSockResult(WSACleanup, 'WSACleanup'); except exit;
突然要用到如题功能,自己在网上搜了下,自己写了个小Demo,以备以后不时之需。。。 特此鸣谢资料一:http://hi.baidu.com/654474209/blog/item/77b28224e95dae1e8a82a1ac.html function PingHost(Host IP : String ):   Boolean;       P IP OptionInform
------转自 http://apps.hi.baidu.com/share/detail/33014978 有开发网络应用经历的人都知道,网络中的接收和发送数据都是使用WINDOWS中的 SOCKET 进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字 是否 还可以使用呢?    有人一定想到使用Send函数中的返回结果来进行判断。如果返回
原文链接:30 张图解: TCP 重传、滑动窗口、流量控制、拥塞控制_小林coding-CSDN博客 转载只是为了自己做一些笔记,特别感谢原文大佬的总结ovo 文章目录正文重传机制超时重传快速重传SACK 方法Duplicate SACK滑动窗口流量控制操作系统缓冲区与滑动窗口的关系窗口关闭糊涂窗口综合症拥塞控制慢启动拥塞避免算法拥塞发生快速恢复拥塞算法示意图巨人的肩膀读者问答 相信大家都知道 TCP 是一个可靠传输的协议,那它是如何保证可靠的呢? 为了实现可靠性传输,需要考虑很多事情,例如数据的破
function PortOccupied(const APort:Integer):Boolean; // Delphi 中判断TCP 端口 是否 被占用 S:T Socket ; WSD :TWSAData; SockAddrIn:TSockAddrIn; begin Result:=False; if (WSAStartup(MAKEWORD(2,2),WSD)= 0) then begin S := Socket (AF_INET,SOCK_ STREAM , IP PROTO_TCP); if (S &l
1.调用 socket 创建一个套接字描述符。 2.调用setsockopt关闭套接字描述符的SOL_ SOCKET 级别中的SO_REUSEADDR。 3.调用bind,判断特定的 端口 是否 能够绑定,根据返回结果可以判断出 端口 是否 被占用。 上述步骤2中,打开SO_REUSEADDR的作用是:即是之前将特定 端口 用作本地 端口 的连接依然存在,也同样允许再次将该 端口 绑定到新的套接字中。所以