套接字(流)与套接字(数据报)之间有什么区别?为什么用一个而不是另一个?
我知道一个好的设计应该避免这种情况,但我不清楚这些系统API将如何表现.我也找不到相同的好文档.
方向上的任何指针都会有所帮助.
我最近看到了一些看起来像这样的代码(当然sock是一个套接字对象):
sock.shutdown(socket.SHUT_RDWR)
sock.close()
Run Code Online (Sandbox Code Playgroud)
在套接字上调用shutdown然后关闭它的目的究竟是什么?如果它有所不同,则此套接字用于非阻塞IO.
套接字API是TCP/IP和UDP/IP通信的事实标准(即我们所知的网络代码).然而,它的核心功能之一,accept()有点神奇.
借用半正式定义:
在服务器端使用accept().它接受从远程客户端创建新TCP连接的接收传入尝试,并创建与此连接的套接字地址对关联的新套接字.
换句话说,accept返回一个新的套接字,服务器可以通过该套接字与新连接的客户端进行通信.旧套接字(在其accept上调用)保持打开状态,在同一端口上侦听新连接.
accept工作怎么样?它是如何实现的?这个话题有很多混乱.许多人声称接受打开一个新端口,并通过它与客户沟通.但这显然不是真的,因为没有新的端口被打开.你实际上可以通过同一个端口与不同的客户端进行通信,但是如何?当多个线程调用recv同一个端口时,数据如何知道去哪里?
我想这是客户端地址与套接字描述符相关联的内容,每当数据通过时recv它被路由到正确的套接字,但我不确定.
对这种机制的内部运作进行彻底的解释是很好的.
我正在玩HTML5 WebSockets.我想知道,如何优雅地关闭连接?比如,如果用户刷新页面或只是关闭浏览器会发生什么?
当用户只是在没有调用的情况下刷新页面时,会出现一种奇怪的行为websocket.close()- 当他们在刷新后返回时会触发该websocket.onclose事件.
如何使用Java以编程方式确定给定计算机中端口的可用性?
即给定一个端口号,确定它是否已被使用?
我试图从套接字读取时出现以下错误.我做了readInt()对InputStream,并且我得到这个错误.仔细阅读文档,这表明连接的客户端部分关闭了连接.在这种情况下,我是服务器.
我可以访问客户端日志文件并且它没有关闭连接,事实上它的日志文件建议我关闭连接.那么有人知道为什么会这样吗?还有什么要检查的?当有可能达到阈值的本地资源时,是否会出现这种情况?
我注意到我有以下几行:
socket.setSoTimeout(10000);
Run Code Online (Sandbox Code Playgroud)
就在之前readInt().这是一个原因(长篇故事),但只是好奇,是否存在可能导致指示错误的情况?我在我的IDE中运行了服务器,我碰巧让我的IDE卡在断点上,然后我注意到完全相同的错误开始出现在我自己的IDE中.
无论如何,只要提一下,希望不是红鲱鱼.:-(
我编写了简单的C程序,它们使用套接字('client'和'server').(UNIX/Linux用法)
服务器端只是创建一个套接字:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)
然后将它绑定到sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Run Code Online (Sandbox Code Playgroud)
并倾听(并接受和阅读):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Run Code Online (Sandbox Code Playgroud)
客户端创建套接字,然后写入它.
现在,我想将这个简单的连接转换为SSL连接,以最简洁,最田园,最新和最快的方式.
我试图将OpenSSL添加到我的项目中,但我找不到一种简单的方法来实现我想要的东西.
两者connect()和bind()系统调用都将套接字文件描述符"关联"到一个地址(通常是ip/port组合).他们的原型如下: -
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Run Code Online (Sandbox Code Playgroud)
和
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Run Code Online (Sandbox Code Playgroud)
2个电话之间的确切区别是什么?应该connect()何时使用何时bind()?
具体来说,在一些示例服务器客户端代码中,发现客户端正在使用connect()而服务器正在使用该bind()调用.理由并不完全清楚.
sockets ×10
c ×3
networking ×3
java ×2
asynchronous ×1
connection ×1
datagram ×1
html5 ×1
javascript ×1
linux ×1
port ×1
python ×1
ssl ×1
tcp ×1
unix ×1
websocket ×1