【发布时间】:2020-12-22 16:12:49
【问题描述】:
我试图回到一个旧的 C 项目,但从一开始它就不再工作了。 基本上它所做的是它只是为远程主机(我可以 ping)创建一个套接字(使用 WSAConnect),但每次尝试连接到远程主机时我都会超时。
代码如下:
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 1024
void BindSock(char* rhost, int rport);
int main(int argc, char** argv) {
//FreeConsole(); // This is the way to make the cmd vanish
char rhost[] = "g0blin.ovh"; // ip to connect to
int rport = 1111;
BindSock(rhost, rport);
return 0;
}
void BindSock(char* rhost, int rport) {
/*while (1) {*/
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup function failed with error: %d\n", iResult);
return;
}
printf("[*] Winsock init ... \n");
//init socket props
SOCKET sock;
sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);
if (sock == INVALID_SOCKET) {
printf("socket function failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return;
}
printf("[*] Sock init ... \n");
//Filling struc props
struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
InetPton(AF_INET, rhost, &(clientService.sin_addr));
clientService.sin_port = htons(rport);
printf("[*] attempting to connect \n");
iResult = WSAConnect(sock, (SOCKADDR*)&clientService, sizeof(clientService), NULL, NULL, NULL, NULL);
if (iResult == SOCKET_ERROR) {
printf("[!] connect function failed with error: %ld\n", WSAGetLastError());
iResult = closesocket(sock);
if (iResult == SOCKET_ERROR)
printf("[!] closesocket function failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return;
}
printf("[X] Sock Connected\n");
到目前为止我尝试了什么:
- 我尝试 ping 主机,我可以
- 我更改了远程主机,但它不起作用(我也可以 ping 它)
- 我尝试禁用防火墙和防病毒软件
我的猜测:
由于除了 Timeout 之外我没有错误代码,我想知道是否某些标准发生了变化,并且它会干扰它应该工作的方式。
感谢您的宝贵时间
【问题讨论】:
-
尝试使用 LocalHost (
127.0. 0.1) 作为rhost进行快速测试。 -
InetPton是做名称解析还是只能处理文本形式的数字 IP 地址? (例如“127.0.0.1”)检查clientService.sin_addr中的返回值和结果 -
@ryyker 我试过 localhost 也没用
-
LocalHost(127.0. 0.1) 并使用rport = 80我能够在没有其他更改的情况下连接。这表明需要查看您的IP/Port值。 Web 服务器端口通常是80,而 SMTP 服务器使用25。你确定1111是正确的IP地址吗? -
您是否尝试过通过其他程序连接到该端口?例如curl、telnet 或网络浏览器?可能被某处的防火墙阻止
标签: c++ c windows sockets winapi