2. Delphi的版本变来变去的, D6的时候用TServerSocket, 但D7就已经不同了. 所以还是用Win32 Socket API比较可靠:
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的作用是:即是之前将特定
端口
用作本地
端口
的连接依然存在,也同样允许再次将该
端口
绑定到新的套接字中。所以