gpt4 book ai didi

c - 恢复快照后恢复套接字

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:47 25 4
gpt4 key购买 nike

我必须解决以下问题。也许有人可以帮助我。

我想要实现的是虚拟机内的服务(使用virtualbox/WinXP)应该通过套接字(客户端)(1)向主机发送数据。主人(socketserver)然后获取当前系统的快照(2),发送一个ack(3)到虚拟机(再次通过套接字),每一个 Action 都被执行并且服务可以继续(4)。

Service                                               Host
========= =======

Service sends specific data (1)

---------------------------------------->
Invoke Snapshot (2)
| On restore socket gets destroyed (X) |
| No ACK can be accepted -- Endless Loop| Send ACK (3)

<----------------------------------------

Accept ACK and continue (4)

当我将虚拟机恢复到之前的状态时,问题就出现了。软件等待ack继续。虚拟机需要一些时间来恢复它的网络(3-5 秒,直到“您的网络电缆已插入……”中托盘),这会使 socket (X)崩溃。

我没有解决方法。 Service 是用 C 写的。Host 是一个 python 脚本。在我看来, sleep 是最糟糕的解决方案。由于高负载,事情发生的时间是不可预测的。

我想不出解决该问题的好主意。将会如果你能帮助我,那就太好了。

提前致谢!

编辑:

@alk:我做了这个假设,因为客户端不再连接到服务器(由于恢复导致不同的状态,我猜有一段时间失去连接)

这是来自服务的 C 代码。我 Hook 了某些系统调用,并且在调用系统调用时执行了代码

#include <stdio.h>
#include <winsock2.h>
#include <stdarg.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

WSADATA wsa;
SOCKET s;
struct sockaddr_in server;
char buffer[1024];
char ack[1024];
int recv_size;

int mpex_send(const char *str, ...)
{
// Build String
va_list va;
va_start(va, str);
vsnprintf(buffer, sizeof(buffer), str, va);
va_end(va);

// Init
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}

printf("Initialised.\n");

//Create a socket
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
printf("Could not create socket : %d" , WSAGetLastError());
}

printf("Socket created.\n");


server.sin_addr.s_addr = inet_addr("192.168.56.1");
server.sin_family = AF_INET;
server.sin_port = htons( 42000 );

//Connect to remote server
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}

puts("Connected");
//Send some data
if( send(s , buffer , strlen(buffer) , 0) < 0)
{
puts("Send failed");
return 1;
}
puts("Data Send\n");

//Receive a reply from the server
while(1)
{
if((recv_size = recv(s , ack , 2000 , 0)) == SOCKET_ERROR)
{
puts("recv failed");
}

puts("Reply received\n");
ack[recv_size] = '\0';
puts(ack);
// Important, put \n after ack
if (strcmp("ack\n", ack) == 0)
{
puts("Got it");
break;
}
}
closesocket(s);
WSACleanup();
return 0;
}

最佳答案

我设法解决了我的问题。也许有一天会遇到同样的情况,希望这对您有所帮助。

C 代码发送第一条消息后,它将进入循环状态,尝试创建和打开套接字(参见上面的源代码)。如果他们成功了,他们就会崩溃;循环。之后,我循环一个 socket.recv 以从主机获取 ack。

在此状态下,主机收到消息并进入 ack 泛洪状态,向所有连接的客户端发送 ack。因此消息被发送到新的连接以及断开的连接。

C代码收到ack后,向host发送ack_ack停止泛洪。

此页面对 python 服务器部分非常有帮助。 http://www.binarytides.com/code-chat-application-server-client-sockets-python/

希望对你有帮助

关于c - 恢复快照后恢复套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18640619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com