2013-09-05 127 views
2

我得面对以下问题。也许有人可以帮助我。恢复快照后恢复套接字

我想要实现的是虚拟机内的服务(使用虚拟机/ WinXP的 )应通过套接字(客户端)(1)将数据发送到主机。然后,主机 (套接字服务器)拍摄当前系统(2)的快照,向虚拟机(再次通过套接字)发送确认(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) 

当我将vm恢复到先前采用的状态时,会出现问题。 软件等待确认继续。该虚拟机需要一些时间来恢复其网络(3-5秒,直到“您的网络电缆现在插入...”在 托盘中),并且这使插槽(X)崩溃了 。

我对此没有解决方法。该服务是用C语言编写的。主机是一个 python脚本。在我看来,睡眠是最糟糕的解决方案。由于高负荷,直到发生事情的时间是不可预测的。

我不能想出如何解决这个问题的好主意。如果你能帮助我,那将是 。

在此先感谢!

编辑:

@alk:我的假设,因为客户端未连接到服务器了(不同的状态,由于恢复,并失去了一会儿我猜连接)

这里来自服务的C代码。我迷上某些系统调用,当一个系统调用被称为

#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; 
} 
+1

是否服务问题阻塞'recv'这将导致它等待来自主机的ACK? – JackCColeman

+0

你怎么确切地来到这个假设“* ...并且这会使套接字(X)崩溃*”并且你确切地要蚂蚁来表达? – alk

+0

但是,如果您可以提供描述挂起过程的部分的源代码,我们可以提供更多的野生猜测,但(希望)会提供答案。 – alk

回答

2

我设法解决我的问题的代码被执行。也许有一天会遇到相同的,所以希望这有助于。

在发送来自C代码的第一条消息后,它将进入循环状态,尝试创建并打开一个套接字(请参见上面的源代码)。如果他们成功,他们就会破裂循环。之后,我循环一个socket.recv以获取主机的确认。

在这种状态下,主机收到消息并进入ack flooding状态,并向所有连接的客户机发送ack消息。所以这条消息被发送到新的连接以及破坏的连接。

C代码接收到ack后,会向主机发送ack_ack以停止泛洪。

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

希望这有助于