【发布时间】:2022-05-19 04:30:41
【问题描述】:
我正在使用 libsoccr,它允许检查点/恢复 TCP 连接。这是我尝试使用它的方式:
/* some code to initialize and connect the socket */
#define max 10000000
struct libsoccr_sk *so;
struct libsoccr_sk_data data;
int sockfd, dsize, size;
char *buff = (char *)malloc(MAX * sizeof(char));
/* some code to fill the buffer */
write(sockfd, buff, MAX);
so = libsoccr_pause(sockfd);
dsize = libsoccr_save(so, &data, sizeof(data));
/* some code */
函数libsoccr_save(so, &data, sizeof(data))返回-6。
我重新阅读了 libsoccr 的文档,发现“在此调用之前,调用者必须阻止此套接字的任何数据流”谈论 libsoccr_pause(sockfd)。我查看了源代码,发现队列长度是用ioctl(sockfd, SIOCOUTQ, &size) 得到的,后来队列本身的内容是用ret = recv(sockfd, buf, size+1, MSG_PEEK | MSG_DONTWAIT) 得到的。使用gdb,即使队列不为空,我似乎总是得到ret = 0,这肯定是因为我没有阻塞套接字的数据流,但我不知道该怎么做。
那么问题来了,怎么才能阻塞socket的数据流呢?
【问题讨论】:
-
你在哪里初始化 sockfd ?现在看起来你正在写入一个未初始化的套接字。
-
我没有放整个代码,只放了与我的问题有关的部分。套接字已初始化并连接。没问题,服务器端正确接收数据。