我对网络很陌生,并且在while循环期间发送消息时遇到问题。
据我所知,我应该按照以下方式做点什么:
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 软件导致连接中止。 已建立的连接被主机中的软件中止,可能是由于数据传输超时或协议错误
由于
答案 0 :(得分:0)
要了解程序失败的方式和原因,您必须了解所使用的功能。 其中一些是阻塞功能,有些则不是。其中一些需要以前的其他功能,其中一些不需要。 现在从我的理解,我们在这里谈论的是客户,而不是服务器。 在这种情况下,客户端只有非阻塞功能。这意味着无论何时调用函数,它都将在不等待的情况下执行。 因此send()将在调用它的第二个数据时发送数据,然后流将继续执行下一行代码。 如果要发送的信息尚未准备好......您将遇到问题,因为不会发送任何内容。 要解决它,你可以使用某种延迟。延迟的问题在于它们是阻塞功能,这意味着一旦遇到延迟,您的流就会停止。要解决此问题,您可以创建一个线程并锁定它,直到信息准备好发送。 但是那可以完成一个send()的工作。您将发送信息,那就是那些。 如果要保持通信并重复发送信息,则需要创建一个while循环。一旦你有一个while循环,你不必担心任何事情。这是因为您可以通过流控制验证信息已准备就绪,并且可以在终止连接之前反复使用发送。 现在问题是服务器端发生了什么? “ipaddress”应该保存服务器的IP。服务器可能会拒绝您的连接请求。或者最糟糕的是他可能会接受您的请求,但他正在倾听与您的客户有关的不同设置。意思是服务器可能没有恢复(没有recv()函数)信息而您是试图发送信息...可能会在错误/崩溃中失败,什么不是。