【发布时间】:2020-03-08 19:08:18
【问题描述】:
我正在尝试使用getpeerinfo 来确保我可以在连接后获取对等信息。
它失败了:
WSAENOTCONN(10057)套接字未连接。
由于未连接套接字并且(使用 sendto 在数据报套接字上发送时)未提供地址,因此不允许发送或接收数据的请求。
基本流程是:
WSAStartupsocket()connect()getpeerinfo()
我做错了什么?
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Winsock2;
procedure Main;
var
hSocket: TSocket;
wsData: TWSAData;
nodeName: string;
serviceName: string;
localAddressLength: Cardinal;
localAddress: TSockAddr;
remoteAddressLength: Cardinal;
remoteAddress: TSockAddr;
name: TSockAddr;
nameLen: Integer;
errorCode: Integer;
bRes: Boolean;
begin
WSAStartup($0202, {var}wsData);
hSocket := socket(AF_INET, SOCK_STREAM, 0);
nodeName := 'stackoverflow.com';
serviceName := '80';
bRes := WSAConnectByNameW(hSocket, PChar(nodeName), PChar(serviceName),
{var}localAddressLength, {var}localAddress,
{var}remoteAddressLength, {var}remoteAddress,
nil, nil);
if not bRes then
begin
errorCode := WSAGetLastError;
RaiseLastOSError(errorCode);
end;
//If no error occurs, getpeername returns zero.
//Otherwise, a value of SOCKET_ERROR is returned,
//and a specific error code can be retrieved by calling WSAGetLastError.
nameLen := sizeof(name);
errorCode := getpeername(hSocket, {var}name, {var}nameLen);
if errorCode <> 0 then
begin
errorCode := WSAGetLastError;
RaiseLastOSError(errorCode);
end;
end;
begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
我们知道连接已连接,因为:
阅读奖励
【问题讨论】:
-
“连接后您的连接似乎已重置”,引用您的引文。
-
我也很好奇为什么你认为你已经拥有了 peername。
-
对于我没有它的情况(不是每个套接字都会用 WSAConnectByName 打开,甚至由我连接)。还有那个 MSFT 论坛的人没有尝试过,只是猜测。
-
1.您刚刚连接的事实并不能证明它仍然连接。 2. 你做了什么“事情”来检查它是否仍然连接?您的链接中没有提到。唯一有效的测试是成功的
recv()。 3. 有人可能在猜测这一事实并不意味着他们会错。 -
我仍然连接的事实证明我仍然连接。事情就是你引用的引文中的事情。对你起作用吗;你试过了吗? Sobs in sockets api
标签: sockets tcp network-programming