0

我对网络非常陌生,并且在一段时间循环期间发送消息时遇到问题。

据我所知,我应该按照以下方式做一些事情:

Create Socket()
Connect()

While
     Do logic
     Send()
End while

Close Socket()

但是它发送一次并在之后返回-1。

该代码仅在我在循环中创建套接字时才有效。

While
     Create Socket()
     Connect()
     Do logic
     Send()
     Close Socket()
End while

这是我正在使用但不起作用的代码部分:

//init winsock
WSAStartup(MAKEWORD(2, 0), &wsaData);

//open socket
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    //connect
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family      = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
    serveraddr.sin_port        = htons((unsigned short) port);
    connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr));

while(true) {

    if (send(sock, request.c_str(), request.length(), 0)< 0 /*!= request.length()*/) {
        OutputDebugString(TEXT("Failed to send."));
    } else {
        OutputDebugString(TEXT("Activity sent."));
    }
    Sleep(30000);
}
//disconnect
closesocket(sock);

//cleanup
WSACleanup();

函数 CheckForLastError() 返回:10053

WSAECONNABORTED 软件导致连接中止。已建立的连接被主机中的软件中止,可能是由于数据传输超时或协议错误

谢谢

4

2 回答 2

-1

我也一直在寻找解决这个问题的方法。我的服务器也有同样的问题。当尝试从循环内部发送响应时,客户端似乎永远不会收到它。

据我了解问题,根据user207421的建议,当您在客户端和服务器之间建立连接时,协议应该有足够的信息让客户端知道服务器何时完成发送响应。如果您看到此示例,则您有一个响应请求的最小 HTTP 服务器。在这种情况下,您可以使用浏览器或 Postman 等应用程序。如果您看到响应消息,您将看到一个名为Connection. 将其值设置为close告诉客户端哪个是来自服务器的该请求的最后一条消息。消息正在发送,但客户端一直在等待,可能是因为客户端无法识别关闭元素。我也错过了Content-Length标题。我的 HTTP 响应消息错误,客户端丢失。

该图显示了需要在循环之外以及需要在循环内部的内容。

在此处输入图像描述

于 2021-09-17T00:05:53.237 回答
-2

要了解您的程序如何以及为什么会失败,您必须了解您使用的功能。其中一些是阻塞功能,而另一些则不是。其中一些需要先前调用其他函数,而另一些则不需要。现在据我了解,我们在这里谈论的是客户端,而不是服务器。在这种情况下,客户端只有非阻塞功能。这意味着每当您调用一个函数时,它都会在不等待的情况下执行。所以 send() 将在它被调用的第二次发送数据,并且流将继续到下一行代码。如果要发送的信息还没有准备好……你会遇到问题,因为什么都不会发送。要解决它,您可以使用某种延迟。延迟的问题在于它们是阻塞函数,这意味着您的流一旦达到延迟就会停止。要解决它,您可以创建一个线程并将其锁定,直到准备好发送信息。但这将完成一个 send() 的工作。您将发送信息,仅此而已。如果要保持通信并重复发送信息,则需要创建一个while循环。一旦你有一个while循环,你就不必担心任何事情。那是因为您可以使用流控制验证信息是否已准备就绪,并且您可以在终止连接之前反复使用发送。现在的问题是服务器端发生了什么?“ipaddress”应该保存服务器的 ip。服务器可能会拒绝您的连接请求。或者最糟糕的是,他可能会接受您的请求,但他正在使用与您的客户端相关的不同设置进行侦听。

于 2013-04-21T09:13:50.723 回答