我正在尝试构建一个充当服务器和客户端的块,以通过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函数中...
答案 0 :(得分:2)
好吧,这一行肯定是错误的:
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字节。