Skip to content

Instantly share code, notes, and snippets.

@davinci26
Created October 7, 2020 20:55
Show Gist options
  • Save davinci26/af6d00d14e573b2f0838aab337d840e7 to your computer and use it in GitHub Desktop.
Save davinci26/af6d00d14e573b2f0838aab337d840e7 to your computer and use it in GitHub Desktop.
TCP_INFO usage on Windows
#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <windows.h>
#include <winsock2.h>
#include <mstcpip.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char** argv) {
WSADATA wsaData;
int rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
auto sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd == INVALID_SOCKET)
{
rc = WSAGetLastError();
std::cout << "Failed to create socket with error: " << rc << std::endl;
return rc;
}
struct sockaddr_in server;
server.sin_addr.s_addr = inet_addr("1.1.1.1");
server.sin_family = AF_INET;
server.sin_port = htons(80);
//Connect to remote server
rc = connect(sockfd, (struct sockaddr*)&server, sizeof(server));
if (rc == SOCKET_ERROR)
{
rc = WSAGetLastError();
std::cout << "Failed to connect socket with error: " << rc << std::endl;
WSACleanup();
return rc;
}
TCP_INFO_v0 tcpinfo;
DWORD infoVersion = 0;
DWORD bytesReturned = 0;
rc = ::WSAIoctl(sockfd, SIO_TCP_INFO, &infoVersion, sizeof(infoVersion), &tcpinfo, sizeof(tcpinfo), &bytesReturned, nullptr, nullptr);
if (rc == SOCKET_ERROR) {
rc = WSAGetLastError();
std::cout << "Failed to query for TCP_INFO with error: " << rc << std::endl;
WSACleanup();
return rc;
}
rc = closesocket(sockfd);
if (rc == SOCKET_ERROR) {
rc = WSAGetLastError();
std::cout << "Failed to close socket with error: " << rc << std::endl;
WSACleanup();
return rc;
}
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment