草庐IT

非阻塞

全部标签

tcp - 在 Windows 下的非阻塞 TCP 套接字上使用 SO_SNDBUF 的奇怪行为

我试图降低我的非阻塞TCP套接字上的发送缓冲区大小,以便我可以正确显示上传进度条,但我看到了一些奇怪的行为。我正在创建一个非阻塞的TCP套接字,将SO_SNDBUF设置为1024,验证设置是否正确,然后连接(在调用连接之前和之后都试过了,没有区别)。问题是,当我的应用程序实际出现并调用发送(发送大约2MB)而不是返回发送了大约1024个字节时,发送调用显然接受了所有数据并返回了2MB的发送值(正是我通过了)。一切都正常运行(这是一个HTTPPUT,我得到了一个响应,等等)但是我最终在我的进度条中显示的是上传在100%大约30秒然后响应进来。我已经确认,如果我在收到响应之前停止,则上传不

c++ - 简单套接字非阻塞 I/O

我正在尝试在服务器和客户端之间实现非阻塞I/O。两者连接后,我尝试使用fork来处理IO,但是服务器端在尝试读取“传输端点未连接”时出错,并且发生了两次(我猜是因为fork?).服务器代码//includestakenout#definePORT"4950"#defineSTDIN0structsockaddrname;voidset_nonblock(intsocket){intflags;flags=fcntl(socket,F_GETFL,0);assert(flags!=-1);fcntl(socket,F_SETFL,flags|O_NONBLOCK);}//getsocka

sockets - TCP 阻塞套接字 - 在不同数据包中接收少量字节的可能性

如果服务器发送4个字节send(sock,buffer1,4,0);客户端正好等待4个字节recv(sock,buffer2,4,0);buffer2有没有可能写入不到4个字节?之前没有进行其他send或recv。如果不可能,send可以做的缓冲区的最大大小是多少,以便recv可以在一次调用中获得相同的缓冲区大小。 最佳答案 没有所谓的“消息”,除了你自己界定的。重复:没有消息这样的东西。TCP不发送消息,它发送八位字节流。您需要在循环中发送,以防未确认数据积压并且send没有使用您传入的整个缓冲区。您需要在循环中接收,以防发送堆栈

c# - NetworkStream.Write 阻塞到什么时候?

我能想到这些可能的答案:直到数据被写入IP堆栈中的某个内部缓冲区。直到数据通过网络发送。直到从另一台机器收到接收确认。 最佳答案 直到数据写入发送端的发送缓冲区。因此,如果缓冲区已满,它将阻塞。如果由于网络问题或接收方的接收缓冲区已满而尚未传输数据,则发送缓冲区可能已满。您可以进行一个实验:创建发送方和接收方,将发送方的套接字发送缓冲区设置为较小的值,并将接收方的接收缓冲区设置为较小的值。开始发送,接收方接受连接,但不接收。当发送的字节数约为SenderSendBuffer+ReceiverReceiveBuffer时,socket

阻塞模式下的 Linux TCP 套接字

当我以阻塞模式创建TCP套接字并使用send(或sendto)函数时,函数调用何时返回?是否必须等到套接字的另一端接收到数据?那样的话,如果网络堵车,会不会堵很久? 最佳答案 发送方和接收方(以及可能的中介)都会缓冲数据。数据发送成功并不能保证接收端已经收到。通常写入阻塞套接字,只要发送方缓冲区中有空间就不会阻塞。一旦发送方的缓冲区已满,写入将阻塞,直到其中有空间用于整个写入。如果写入部分成功(接收方关闭套接字、将其关闭或发生错误),则写入返回的字节数可能少于预期。随后的写入应该给出错误或返回0-这种情况在TCP套接字上是不可逆的。

boost - boost::asio tcp 套接字关闭是否阻塞?

boost::asioTCPsocketaccept/read/write均提供异步版本,但不提供关闭版本。在我的代码中,我只调用socket.close(),大多数时候它工作正常。它触发了正常的TCP关闭。但有时,close()只是关闭套接字而没有关闭TCP。结果,我不得不调用shutdown()来代替。但我不想阻止我的代码。shutdown()是否在boost:asio中阻塞?关闭()怎么样?close()是否阻塞? 最佳答案 首先,Boost.Asio中的shutdown()和close()调用调用底层的BSD套接字实现。因此

sockets - 如何在 Corona SDK Lua 中运行阻塞操作?

我是LUA的新手,我正在使用CoronaSDK在LUA中编写一个tcp消息传递库。我遇到了一个问题,即使它在协程中运行,套接字读取操作也会挂起应用程序UI。我如何启动协程:functionMessaging:readLoop()self.readCoroutine=coroutine.create(function()self:blockingLoop()end)coroutine.resume(self.readCoroutine)end阻塞循环:functionMessaging:blockingLoop()line,err,rest=self.sock:receive(BUFSI

c++ - BSD 套接字 - 如何使用非阻塞套接字?

我正在尝试使用非阻塞TCP套接字。问题是他们还在阻塞。代码如下-服务器代码-structsockaddrname;charbuf[80];voidset_nonblock(intsocket){intflags;flags=fcntl(socket,F_GETFL,0);assert(flags!=-1);fcntl(socket,F_SETFL,flags|O_NONBLOCK);}intmain(intagrc,char**argv){intsock,new_sd,adrlen;//sockisthissocket,new_sdisconnectionsocketname.sa_f

具有非阻塞或多线程功能的 Ruby Tcp Server 类

找不到任何可以帮助构建非阻塞/多线程服务器的gem或类。哪里可以找到? 最佳答案 Rubydocs在套接字上有一些很好的例子。使用该页面中的信息,我使用非阻塞套接字拼凑了一个简单的客户端和服务器。这些主要是该页面的代码副本,并进行了一些更改。简单的服务器代码(使用您可能感兴趣的accept_nonblock调用):require'socket'includeSocket::Constantssocket=Socket.new(AF_INET,SOCK_STREAM,0)sockaddr=Socket.sockaddr_in(6212

c++ - 异步,非阻塞套接字行为-WSAEWOULDBLOCK

我继承了两个应用程序,一个在Windows7PC上运行的TestHarness(客户端),另一个在Windows10PC上运行的服务器应用程序。我正在尝试使用TCP/IP套接字在两者之间进行通信。客户端将请求(以XML形式的数据)发送到服务器,然后服务器将请求的数据(也是XML)发送回客户端。设置如下所示:ClientServer----------------------------------------||SendsRequests|||ClientSocket|----------------->|ServerSocket|||此过程始终适用于初始连接(即新启动的客户端和服务器