c - 恢复快照后恢复Socket

标签 c sockets virtualbox

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

我想要实现的是虚拟机内的服务(使用 virtualbox/WinXP) 应通过套接字(客户端)(1) 将数据发送到主机。主人 (socketserver)然后拍摄当前系统的快照(2),发送一个ack(3)到 虚拟机(再次通过套接字),执行了每个操作并且服务 可以继续(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)

当我将虚拟机恢复到之前的状态时,就会出现问题。 软件等待确认继续。虚拟机需要一些时间才能恢复 它的网络(3-5 秒直到“您的网络电缆现已插入...”) 托盘),这会导致套接字崩溃(X)。

我没有解决方法。该服务是用 C 编写的。主机是一个 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后,会向主机发送ack_ack以停止泛洪。

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

希望这有帮助

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

相关文章:

c - 字符串反转程序中的内存问题

c - 堆上的多维数组 - C

c# - 如何在 .NET 中调试类库

scala - 使用 Akka IO 通过 Tcp 客户端发送非 ByteString

virtualbox - 做 vagrant up 时出错

在virtualbox中的ubuntu上安装docker,无法提取图像

c - 如何防止整数在 C 中除法时截断值?

c - 如何从 Linux 上的特定接口(interface)发送 UDP 数据包?

c - 原始套接字编程 - 为什么 printf() 会影响数据包发送?

macos - 使用适用于 Mac 的 Docker 工具箱和已安装的 Virtualbox 有任何冲突吗?