【问题标题】:block data flow from a TCP socket阻止来自 TCP 套接字的数据流
【发布时间】: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 ?现在看起来你正在写入一个未初始化的套接字。
  • 我没有放整个代码,只放了与我的问题有关的部分。套接字已初始化并连接。没问题,服务器端正确接收数据。

标签: c sockets tcp


【解决方案1】:

阻塞套接字数据流的一个好方法是使用“plug qdisc”。所有文档都可以在这里找到:https://www.infradead.org/~tgr/libnl/doc/api/group__qdisc__plug.html

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-05-31
相关资源
最近更新 更多