你好,我正在使用winsock2库编写一个带有套接字的客户端(我通常在unix中这样做,但我想在windows中尝试)。当我将套接字连接到 IP 时,出现错误 10038。我用 google 搜索 msdn,发现我正在非套接字上执行套接字操作。如果我是正确的,则意味着我没有以正确的方式创建套接字或“绑定”地址和端口到套接字。尽了最大努力,但在我的代码中找不到任何错误。 提前致谢。
这是代码:
#include <stdio.h>
#include <WinSock2.h>
#include <ws2tcpip.h>
#define okay(msg, ...) printf("[+] " msg "\n", ##__VA_ARGS__)
#define info(msg, ...) printf("[!] " msg "\n", ##__VA_ARGS__)
#define error(msg, ...) printf("[-] " msg "\n", ##__VA_ARGS__)
int main() {
WSADATA wsa;
SOCKET cs;
struct sockaddr_in addr;
char* ip = "127.0.0.1";
int port = 4444;
info("Initializing socket...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
error("Couldn't initialize socket. Error -> %d", WSAGetLastError());
WSACleanup();
return EXIT_FAILURE;
}
okay("Succesfully initialized socket.");
info("Creating socket...");
if (cs = socket(AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET) {
error("Couldn't create socket. Error -> %d", WSAGetLastError());
WSACleanup();
return EXIT_FAILURE;
}
okay("Succesfully created socket.");
addr.sin_family = AF_INET;
InetPton(AF_INET, ip, &addr.sin_addr.s_addr);
addr.sin_port = htons(port);
//info("IP -> %d", addr.sin_addr.s_addr);
//info("PORT -> %d", addr.sin_port);
info("Connecting to -> %s:%d", ip, port);
if (connect(cs, (SOCKADDR *) &addr, sizeof(addr)) != 0) {
error("Couldn't connect to %s:%d, error -> %d", ip, port, WSAGetLastError());
WSACleanup();
return EXIT_FAILURE;
}
okay("Connected to %s:%d", ip, port);
char* msg = "lol";
int response = send(cs, msg, strlen(msg), 0);
if(response == SOCKET_ERROR){
error("Couldn't send message to %s:%d", ip, port);
info("Closing socket...");
WSACleanup();
okay("Succesfully closed socket.");
return EXIT_FAILURE;
}
okay("Succesfully sent %d bytes to %s:%d", response, ip, port);
info("Closing socket...");
WSACleanup();
okay("Succesfully closed socket.");
return EXIT_SUCCESS;
}
问题不在于 connect() 调用,而在于如何存储 socket() 的返回值。
if (cs = socket(AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET)
这不会将socket()的返回值存储到cs中并与INVALID_SOCKET进行比较,而是将socket()的返回值与INVALID_SOCKET进行比较并将比较结果存储到cs中。 这意味着,成功调用时,结果为 0(因为套接字不是无效的),出错时结果为 1。这些值可能是有效的套接字,但很可能它们不是您创建的套接字。
要解决这个问题,您可以添加括号或将行分成两部分,如下所示:
// Add parentheses
if ((cs = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
...
或
// Divide the operation into two lines
cs = socket(AF_INET, SOCK_STREAM, 0);
if(cs == INVALID_SOCKET) {
...