在DELPHI中如何使用SOCKET编程中的KEEP_ALIVE选项呢???能给一段代码吗??? ( 积分: 100 )

  • 主题发起人 主题发起人 fxh7622
  • 开始时间 开始时间
我是这样使用的:sto.sin_family:=AF_INET;
sto.sin_port:=htons(888);
sto.sin_addr.s_addr:=htonl(INADDR_ANY);
opt:=1;
if setsockopt(sck,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR then
begin
closesocket(sck);
end;
if bind(sck,sto,sizeof(sto))=SOCKET_ERROR then
begin
closesocket(sck);
end
但是当发送端断开网线的时候,我并没有接受到任何的信息,这是为什么呢???
 
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <iostream.h>


#define PROTOCOL_STRING_ICMP_TXT &quot;ICMP&quot;
#define PROTOCOL_STRING_TCP_TXT &quot;TCP&quot;
#define PROTOCOL_STRING_UDP_TXT &quot;UDP&quot;
#define PROTOCOL_STRING_SPX_TXT &quot;SPX&quot;
#define PROTOCOL_STRING_NCP_TXT &quot;NCP&quot;
#define PROTOCOL_STRING_UNKNOW_TXT &quot;UNKNOW&quot;

typedef struct _TCP{ WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 顺序号
DWORD AckNum; // 确认号
BYTE DataOff; // TCP头长
BYTE Flags; // 标志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校验和
WORD UrgPtr; // 紧急指针
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;


typedef struct _IP{
union{ BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服务类型
WORD TotalLen; // 总长
WORD ID; // 标识
union{ WORD Flags; // 标志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 协议
WORD HdrChksum; // 头校验和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
BYTE Options; // 选项
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;


#define MAX_NAME 260
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 255


void GetProtocolTxt(int Protocol, char OutText[MAX_NAME])
{
switch (Protocol){
case IPPROTO_ICMP : //1 /* control message protocol */
strcpy(OutText, PROTOCOL_STRING_ICMP_TXT); break;
case IPPROTO_TCP : //6 /* tcp */
strcpy(OutText, PROTOCOL_STRING_TCP_TXT); break;
case IPPROTO_UDP : //17 /* user datagram protocol */
strcpy(OutText, PROTOCOL_STRING_UDP_TXT); break;
default:
strcpy(OutText, PROTOCOL_STRING_UNKNOW_TXT);
}
return;
}




void main()
{
WSADATA WSAData;
// 检查 Winsock 版本号,WSAData为WSADATA结构对象
WSAStartup(MAKEWORD(2, 2), &amp;WSAData);

SOCKET sock;
// 创建原始套接字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

BOOL flag;
// 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&amp;flag, sizeof(flag));

char LocalName[MAX_NAME];
// 获取本机名
gethostname((char*)LocalName, sizeof(LocalName)-1);

hostent *pHost;
// 获取本地 IP 地址
pHost = gethostbyname((char*)LocalName);

// 填充SOCKADDR_IN结构
sockaddr_in addr_in;
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);

// 把原始套接字sock 绑定到本地网卡地址上
bind(sock, (PSOCKADDR)&amp;addr_in, sizeof(addr_in));

// dwValue为输入输出参数,为1时执行,0时取消
DWORD dwValue = 1;

// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL, &amp;dwValue);

char RecvBuf[BUFFER_SIZE];
IP ip;
TCP tcp;
char OutText[MAX_NAME];

while (true)
{
// 接收原始数据包信息
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
if (ret > 0)
{
// 对数据包进行分析,并输出分析结果
ip = *(IP*)RecvBuf;
tcp = *(TCP*)(RecvBuf + ip.HdrLen);

GetProtocolTxt(ip.Protocol, OutText);

cout << &quot;协议:&quot; << OutText << endl;
cout << &quot;IP源地址:&quot; << inet_ntoa(*(in_addr*)&amp;ip.SrcAddr) << endl;
cout << &quot;IP目标地址: &quot; << inet_ntoa(*(in_addr*)&amp;ip.DstAddr) << endl;
cout << &quot;TCP源端口号:&quot; << tcp.SrcPort << endl;
cout << &quot;TCP目标端口号:&quot; << tcp.DstPort << endl;
cout << &quot;数据包长度:&quot; << ntohs(ip.TotalLen) << endl;
cout << endl << endl << endl;
}
}

return;
}
 
接受答案了.
 
后退
顶部