`
zhaohaolin
  • 浏览: 1016381 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Socket笔记【转】

阅读更多

1、  为了增加效率,可以考虑采用无异常的函数
.net2.0 Socket.Send,Socket.Receive 有了无异常的函数
Socket.Send(Byte[], Int32, Int32, SocketFlags, SocketError)
Socket.Receive(Byte[], Int32, Int32, SocketFlags, SocketError)
减少不必要的异常,就等于增加效率。

2 Socket.Connected 不是当前的 Socket 状态
MSDN 原文:获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。
应当如何解决呢?

同样 MSDN 也告诉了我们:
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035) ,则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
3
、要用 Socket.Poll 判断是否可以接收,不要用 Socket.Available
虽然 Socket.Available 可以偷窥到当前 Recv 缓冲区字节数,而且 Available Poll 速度的两倍,但是 MSDN 说到 :如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。
所以当网络断开的时候单纯使用 Socket.Available 判断是否 recv 到数据会存在不知道客户端已经断开 Bug
补充: 不推荐使用 Socket.Poll Socket 的列表遍历,应当使用 Socket.Select (或者其他模型), Socket.Poll 是对 Socket.Select 的封装,执行 Socket.Poll 耗时是非阻塞 Socket.Recv 的三倍。
4
、非阻塞模式不能采用 Receive 的返回值表示是否断开
3 条说道:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。但这并不能阻塞模式说明 Socket 已经断开, 这一条和 C recv 函数不同,需要特别注意 。需要判断 out 出来的 SocketError ,当不为 SocketError.Success SocketError.Interrupted SocketError.WouldBlock 时就可以认为网络已经断开。
5
Send 可能出现缓冲区满的情况
判断 out 出来的 SocketError ,如果等于 SocketError.WouldBlock ,则是 Send 缓冲区已满,应断开该 Socket ,否则影响整体速度,而不应当 again, 反过来说允许的错误码只有 SocketError.Interrupted ,此时可以重来一次。
6
、主动断开 Socket
MSDN 说道 : 如果当前使用的是面向连接的 Socket ,则必须先调用 Shutdown 方法,然后才能关闭 Socket 。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。
所以,网络库的 Close 函数可以封装为先调用 Shutdown(SocketShutdown.Both) ,在调用 Close()
7
Socket 已经关闭 (Close) 但不能在另一端断开
一端 Scoket 已经关闭了,但另一端短时间内仍可以发送数据!这个问题还没有找到解决办法的,但原因已知, 在《 Windows 网络编程技术》一书 (P139-P140) 中说道 : 被动关闭的情况下,应用程序会从对方那里接收一个 FIN 包,并用一个 ACK 包做出响应。此时,应用程序的套接字会变成 ClOSE_WAIT 状态。由于对方已关闭自己的套接字,所以不能再发送数据了。 但应用程序却不同,它能一直发送数据,直到对方的套接字已关闭为止。
分享到:
评论

相关推荐

    socket网络笔记总结(适合新手)

    适合新手学习的网络socket编程笔记,内容详细简单明了。

    perl socket编程笔记

    Perl Socket 编程笔记 Perl Socket 编程笔记是 Perl 语言中 Socket 编程的使用方法和示例程序的集合,适合初学者。下面是 Perl Socket 编程的详细说明: 一、使用 Perl Socket API 首先需要载入 Socket 模块,即 ...

    Socket网络编程学习笔记.zip

    本学习笔记将带你深入理解这一领域,特别是通过Socket接口进行的网络通信。Socket是操作系统提供的一种通信机制,它允许应用程序创建并管理网络连接,进行数据传输。 **TCP/IP协议族** TCP/IP(Transmission ...

    Socket网络编程学习笔记

    这份"Socket网络编程学习笔记"涵盖了从基础概念到高级技术的全面知识,对于初学者来说是一份非常有价值的参考资料。以下是对这份笔记内容的详细解读: 1. **Socket基本概念**:Socket在计算机网络中扮演着桥梁的...

    Socket基础知识笔记

    Socket基础知识是计算机网络编程中的重要概念,主要用于实现进程间的通信,...通过阅读提供的“SOCKET基础知识笔记.docx”文档,你将更深入地理解Socket的工作原理、使用方法和实际应用,进一步提升你的网络编程能力。

    Socket网络编程学习笔记(4)

    Socket网络编程是构建分布式应用程序的基础,它允许两个网络上的进程之间进行双向通信。在本文中,我们将探讨在TCP...在后续的学习笔记中,作者还将探讨如何在消息中传递实体类信息,这将进一步扩展网络通信的能力。

    linux socket编程笔记.rar

    本笔记将深入探讨Linux Socket编程的基本概念、API使用以及常见问题。 首先,我们来了解什么是Socket。Socket,即套接字,是网络通信中的一个抽象概念,它代表了通信两端的一个端点。在Linux中,Socket分为流式...

    C#Socket编程笔记

    ### C# Socket编程知识点 #### 一、Socket概念与作用 **Socket** 是计算机网络通信中的基础组件之一,它提供了一种方式使得不同主机或同一主机内的进程能够通过网络进行通信。在C#中,Socket 的实现主要依赖于 **...

    socket 学习笔记

    以下是对Socket学习笔记的详细解释: 1. **Socket构造方法**: - `Socket()`:创建一个未连接的Socket对象。 - `Socket(InetAddress address, int port)`:创建一个Socket并连接到指定的IP地址和端口。 - `...

    Socket网络编程学习笔记(1)

    ### Socket网络编程基础知识点 #### 一、IP地址操作类详解 在进行Socket网络编程时,熟练掌握IP地址的操作是至关重要的。以下是两个关键的类:`IPAddress`和`IPEndPoint`。 ##### 1. `IPAddress`类 `IPAddress`...

    WindowsSocket学习笔记.docx

    WindowsSocket学习笔记.docx

    WindowsSocket学习笔记.pdf

    WindowsSocket学习笔记.pdf

    android socket server 笔记

    在Android平台上,开发一个Socket服务器是一项常见的任务,它允许设备与其他设备或服务器进行低级的网络通信。Socket编程是网络编程的基础,它提供了一种在不同计算机之间交换数据的机制。下面我们将深入探讨Android...

    Android笔记:Socket客户端收发数据

    在Android开发中,Socket通信是实现设备间数据传输的重要手段,尤其在构建网络服务和进行设备间的实时交互时。本文将深入探讨如何在Android平台上创建一个Socket客户端,以及如何通过TCP协议进行数据的发送和接收。 ...

    C#SOCKET编程笔记.pdf

    C#SOCKET编程笔记.pdf

    Socket通信Des加密笔记

    1.1 Socket通信: Socket通信是计算机网络中实现不同设备间通信的一种机制。在TCP/IP协议栈中,Socket是应用程序通过编程接口(API)与网络服务交互的方式。它提供了在网络中两台计算机之间创建、管理和维护连接的...

Global site tag (gtag.js) - Google Analytics