我正在尝试构建一个 block ,作为服务器和客户端通过 TCP 连接发送和接收数据(2 台不同计算机中的 2 个重复版本)。
这就是我所做的,我正在尝试使用 Windows 命令行“netstat -ab”进行测试以尝试找到 tcp 连接,但我找不到它。
除了给定的错误,我还做错了什么?
bool IPTunnel::runBlock(void) {
int ready =
inputSignals[0]->ready(); // int ready2 = inputTCPConnetion[0]->ready();
// server
SOCKET sockfd, newsockfd;
int portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
SOCKET n;
// create a socket(int domain, int type, int protocol)
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) printf("\n ERROR opening socket");
// bzero((char *)&serv_addr, sizeof(serv_addr));
portno = 5500;
serv_addr.sin_family = AF_INET;
char ipad[10] = "127.0.0.1";
serv_addr.sin_addr.s_addr = *ipad; // INADDR_ANY;
serv_addr.sin_port = htons(portno);
// if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
auto sd = bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// if (sd < 0)
// printf("\n ERROR on binding");
listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
if(newsockfd < 0) printf("ERROR on accept");
printf("server: got connection from %s port %d\n",
inet_ntop(serv_addr.sin_family, &ipad, buffer, clilen),
ntohs(cli_addr.sin_port));
send(newsockfd, "Hello, world!\n", 13, 0);
// bzero(buffer, 256);
n = _read(newsockfd, buffer, 255);
if(n < 0) printf("ERROR reading from socket");
printf("Here is the message: %s\n", buffer);
while(true) {
}
// close(newsockfd);
// close(sockfd);
return 0;
}
这是给出的错误:ip_tunnel.exe 中 0x00007FFE5031B7EC (ucrtbased.dll) 处未处理的异常:将无效参数传递给认为无效参数致命的函数。
在 _read 函数中...
最佳答案
嗯,这行肯定是错的:
serv_addr.sin_addr.s_addr = *ipad; //INADDR_ANY;
如果你想在环回设备上接收传入的 TCP 连接,你应该做更多类似这样的事情:
serv_addr.sin_addr.s_addr = inet_aton("127.0.0.1");
(或者如果您希望从任何连接的网络设备接收它们,请改为指定 INADDR_ANY)
此外,请确保您在程序开始时调用了 WSAStartup()
,否则 Windows 套接字将无法正常工作。
最后一个吹毛求疵:
while(true){}
不是暂停程序执行的好方法。一方面,它通常会以 100% 使用率旋转 CPU,这是非常低效的;另一方面,它会根据 C++ 标准调用未定义的行为。
获得这种行为的更好方法是:
while(true) {Sleep(1000);}
这部分也是错误的/奇怪的:
SOCKET n;
[...]
n = _read(newsockfd, buffer, 255);
...因为 _read
不返回 SOCKET
,它返回 int
。我认为您打算改为声明 int n;
。
最后一个潜在问题:如果您对 bzero(buffer, 256);
的调用被注释掉,那么 buffer
很可能在之后不包含零字节_read()
调用返回,在这种情况下,您的 printf("Here is the message: %s\n", buffer);
之后的调用可以读取到最后buffer
数组并进入其他内存的狂野蓝色,可能导致崩溃(或至少导致打印大量垃圾字节)。解决方法是确保 buffer
数组在 _read()
调用放置在那里的有效字节末尾包含一个 0/NUL 字节。
关于c++ - 尝试打开 TCP 套接字时出错 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195456/