Winsock客户端在本地网络上发生错误11004
Error 11004 on Local NetWork with Winsock Client
问题
我正在使用代码连接到HW终端上的Localhost作为服务器,并且可以连接。
然后,我尝试在另一台计算机上的本地网络上的另一台计算机上设置服务器。
WSAGETLASTERROR()11004
怎么了?我只是不知道。
代码
Winsock客户的代码是:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <string>
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <cstdlib>
#include <cstdio>
#include <time.h>
// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "2112"
#define DEFAULT_PROTO SOCK_STREAM
int main()
{
char Buffer[128];
// default to localhost
char *server_name = "localhost";
unsigned short port = atoi(DEFAULT_PORT);
int retval, loopflag = 0;
int i, loopcount, maxloop = -1;
unsigned int addr;
int socket_type = DEFAULT_PROTO;
struct sockaddr_in server;
struct hostent *hp;
int first = 1;
WSADATA wsaData;
SOCKET conn_socket;
// srand(time(NULL));
if ((retval = WSAStartup(0x202, &wsaData)) != 0)
{
fprintf(stderr, "Client: WSAStartup() failed: Error %dn", retval);
WSACleanup();
return -1;
}
else
printf("Client: WSAStartup() is OK.n");
printf("Defina o nome ou IP do servidor[default = localhost]:n");
// scanf( "%s" , Buffer );
gets_s(Buffer);
if (Buffer[0] != 0)
server_name = Buffer;
// server_name = &Buffer;
if (isalpha(server_name[0]))
{ // server address is a name
hp = gethostbyname(server_name);
}
else
{ // Convert nnn.nnn address to a usable one
addr = inet_addr(server_name);
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
}
if (hp == NULL)
{
fprintf(stderr, "Client: Endereco IP nao identificado "%s": Error %dn", server_name, WSAGetLastError());
WSACleanup();
exit(1);
}
else
printf("Client: gethostbyaddr() esta OK.n");
memset(Buffer, 0, 128);
printf("Defina a porta do server[default = 2112]:n");
gets_s(Buffer);
if (Buffer[0] != 0)
port = atoi(Buffer);
memset(&server, 0, sizeof(server));
memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); /* Open a socket */
if (conn_socket <0)
{
fprintf(stderr, "Client: Erro ao abrir o socket: Error %dn", WSAGetLastError());
WSACleanup();
return -1;
}
else
printf("Client: socket() esta OK.n");
printf("Client: Cliente conectando com: %s.n", hp->h_name);
conn_socket = socket(AF_INET, socket_type, 0); /* Open a socket */
if (connect(conn_socket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
{
fprintf(stderr, "Client: connect() falhou: Error %dn", WSAGetLastError());
WSACleanup();
return -1;
}
else
printf("Client: connect() esta OK.n");
loopcount = 0;
return 0;
}
使用Visual Basic 2015进行编译,使用:Project > Properties > Configuration Properties > C/C++ > Preprocessor > Preprocessor Definitions
_WINSOCK_DEPRECATED_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
测试
- 使用
telnet
和ping
在使用大力神HW终端创建的其他服务器上工作。 - 使用大力神HW终端作为计算机A上的客户端和计算机B上的服务器也有效,所以我认为它是我的代码。
- 使用
nmap -p 2112 192.168.1.134
结果是:
Nmap scan report for 192.168.1.134
Host is up (0.00s latency).
PORT STATE SERVICE
2112/tcp open kip
MAC Address: 00:19:BB:F7:48:29 (Hewlett Packard)
Nmap done: 1 IP address (1 host up) scanned in 3.31 seconds
来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v = vs.85).aspx
wsano_data 11004
有效名称,没有请求类型的数据记录。请求的名称有效,并且在数据库中找到,但是它没有解决的正确关联数据。通常的例子是使用DNS(域名服务器)的主机名称对地址翻译尝试(使用GethostByName或Wsaasyncgethostbyname)。返回MX记录,但没有记录 - 指示主机本身存在,但不能直接到达。
您的代码在gethostbyaddr(...)
失败。这是因为您的路由器上的DNS没有计算机的DNS记录。
拥有地址,端口和协议,您应该直接尝试使用它连接到服务器。
另外,GethostbyAddr已被弃用:请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms738521(v = vs.85).aspx
供有关如何设置套接字连接的参考,请参见http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#connect
在Beej的代码中,您会看到一个getAddrinfo调用。如图所示,支持主机名或虚线IP字符串,因此您应该能够从示例中列出以下代码:
if (isalpha(server_name[0]))
{ // server address is a name
hp = gethostbyname(server_name);
}
else
{ // Convert nnn.nnn address to a usable one
addr = inet_addr(server_name);
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
}
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- Winsock客户端在本地网络上发生错误11004