gpt4 book ai didi

sockets - 套接字未阻塞写入操作 : OpenSolaris

转载 作者:可可西里 更新时间:2023-11-01 02:52:54 24 4
gpt4 key购买 nike

我有一个单元测试来检查阻塞和非阻塞套接字的行为——服务器写了一个很长的响应,在某些时候它不应该再写了,它写入 block 。

基本上是一边写,另一边不读。

在 Solaris 下,有时我会收到错误“空间不足”(写入 75MB 后),而不是在写入时阻塞:

重现问题的程序:

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>

char const *address = "127.0.0.1";
#define check(x) do { if( (x) < 0) { perror(#x) ; exit(1); } } while(0)

int main()
{
signal(SIGPIPE,SIG_IGN);
struct sockaddr_in inaddr = {};
inaddr.sin_family = AF_INET;
inaddr.sin_addr.s_addr = inet_addr(address);
inaddr.sin_port = htons(8080);

int res = fork();
if(res < 0) {
perror("fork");
exit(1);
}
if(res > 0) {
int fd = -1;
int status;
sleep(1);
check(fd = socket(AF_INET,SOCK_STREAM,0));
check(connect(fd,(sockaddr*)&inaddr,sizeof(inaddr)));
sleep(5);
close(fd);

wait(&status);
return 0;
}
else {
int acc,fd;
check(acc = socket(AF_INET,SOCK_STREAM,0));
int yes = 1;
check(setsockopt(acc,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)));
check(bind(acc,(sockaddr*)&inaddr,sizeof(inaddr)));
check(listen(acc,10));
check(fd = accept(acc,0,0));

char buf[1000];
long long total= 0;
do {
int r = send(fd,buf,sizeof(buf),0);
if(r < 0) {
printf("write %s\n",strerror(errno));
return 0;
}
else if(r==0) {
printf("Got eof\n");
return 0;
}
total += r;
if(total > 100*1024*1024) {
printf("Too much!!!!\n");
return 0;
}
printf("%lld\n",total);
}while(1);
}
return 0;
}

Solaris 上的输出(最后两行)

75768000
write Not enough space

Linux 上的预期输出(最后两行)

271760
write Connection reset by peer

这仅在另一端关闭套接字时发生。

关于为什么以及如何修复它的任何想法,要设置哪些选项?

P.S.: 是 OpenSolaris 2009.06, x86

编辑

  • 添加了重现问题的完整 C 代码

答案:

这似乎是特定版本的 Solaris 内核、libc 库中的错误。

最佳答案

从 OpenSolaris 源代码来看,SO_SNDTIMEO 选项恐怕不受支持:https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/uts/common/inet/sockmods/socksctp.c#l1233

关于sockets - 套接字未阻塞写入操作 : OpenSolaris,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com