C 恢复快照后恢复套接字
我必须解决以下问题。也许有人能帮我 我想要实现的是在虚拟机中的服务(使用 virtualbox/WinXP)应通过套接字(客户端)(1)向主机发送数据。主持人 (socketserver)然后拍摄当前系统的快照(2),将ack(3)发送到 vm(再次通过套接字)确认每个操作都已执行,并且服务 可以继续(4)C 恢复快照后恢复套接字,c,sockets,virtualbox,C,Sockets,Virtualbox,我必须解决以下问题。也许有人能帮我 我想要实现的是在虚拟机中的服务(使用 virtualbox/WinXP)应通过套接字(客户端)(1)向主机发送数据。主持人 (socketserver)然后拍摄当前系统的快照(2),将ack(3)发送到 vm(再次通过套接字)确认每个操作都已执行,并且服务 可以继续(4) 服务主机 ========= ======= 服务发送特定数据(1) --------------
服务主机
========= =======
服务发送特定数据(1)
---------------------------------------->
调用快照(2)
|恢复时套接字被破坏(X)|
|无法接受任何确认——无止境循环|发送确认(3)
我设法解决了我的问题。也许有一天会遇到同样的情况,所以希望这会有所帮助
在发送C代码的第一条消息后,它将进入循环状态,尝试创建并打开套接字(参见上面的源代码)。如果他们成功了,他们就会失败;循环。之后,我循环一个socket.recv以从主机获取ack
在此状态下,主机收到消息并进入ack洪泛状态,在该状态下,它向所有连接的客户端发送ack。因此,消息被发送到新的连接以及断开的连接
C代码收到ack后,会向主机发送ack_ack以停止泛洪
这个页面对于python服务器部分非常有用。
希望这有帮助服务是否会发出阻塞recv
,这会导致它等待主机的确认?您如何准确地得出这个假设“…这会使套接字(X)崩溃。”您想表达什么呢?但是,如果您能提供描述挂起部分进程的源代码,我们可以提供更多的猜测,但(希望)答案。
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)
#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;
}