我目前正在使用 Windows 操作系统并使用 C 进行编码。
我是套接字编程的完全初学者,并且下面的代码片段返回不需要的值。 (
MAXLINE
= 4096),并且我已定义 CTR_SECURITY...
。
const char* IPADDRESS = "142.250.79.46";
int sockFileDescriptor = 0, n;
int sendbytes = 0;
SOCKADDR_IN servaddr = { 0 };
char sendl[MAXLINE];
char recvl[MAXLINE];
memset(sendl, 0, MAXLINE);
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
if (0 > (sockFileDescriptor = socket(AF_INET, SOCK_STREAM, 0))) {
printf("no socket");
exit(-1);
}
memset((char*)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(1337);
int a = InetPton(AF_INET, IPADDRESS, &servaddr.sin_addr.S_un.S_addr);
if (0 >= a) {
printf("inetPton %d, returnV = %d", WSAGetLastError(), a);
exit(-1);
}
if (0 > connect(sockFileDescriptor, (SOCKADDR*)&servaddr, sizeof(servaddr))) {
printf("connect wrong %d", WSAGetLastError());
exit(-1);
}
sprintf(sendl, "GET / HTTP/1.1\r\n\r\n");
sendbytes = strlen(sendl);
/*
if (_write(sockFileDescriptor, sendl, sendbytes) != sendbytes) {
printf("error");
exit(-1);
}*/
if (0 > send(sockFileDescriptor, sendl, strlen(sendl), 0)) {
printf("sendGoneWrong");
exit(-1);
}
memset(recvl, 0, MAXLINE);
while ((n = _read(sockFileDescriptor, recvl, MAXLINE - 1))>0) {
printf("%s", recvl);
}
exit(0);
它返回
"inetPton 10022, returnV = 0"
。
我尝试过其他IP地址,但没有一个改变结果,让我相信我没有正确使用
InetPton()
功能。
顺便问一下,在
InetPton()
中,我应该使用servAddr.sin_addr
还是servaddr.sin_addr.S_un.S_addr
?
您可以替换所有这些:
memset((char*)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(1337);
int a = InetPton(AF_INET, IPADDRESS, &servaddr.sin_addr.S_un.S_addr);
if (0 >= a) {
printf("inetPton %d, returnV = %d", WSAGetLastError(), a);
exit(-1);
}
有了这个:
ADDRINFOA *result = NULL;
ADDRINFOA hints = { 0 };
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_NUMERICHOST;
GetAddrInfoA(IPADDRESS, "1337", &hints, &result);
if (result != NULL) {
memcpy(&servaddr, result->ai_addr, sizeof(servaddr));
FreeAddrInfoA(result);
}