UDP在调用sendto发送数据时候,如果发送目的地不可达(比如说服务器没有启动),sentdo函数不会错误返回。sendto函数正确返回仅表示接口输出队列上为IP数据包留出空间,但并不表示数据成功到达了目的地。这种错误称之为异步错误。
如果对UDP调用connect函数,则可以保证异步错误能够正确的返回给应用进程,在调用connect时候,如果目的地不可达,则会返回给应用进程。
UDP调用connect不会经过三路握手像TCP一样建立一个链接,对于调用过connect的udp接口称之为已链接UDP套接口,它只包含下面3种变化。
1.会返回异步错误给应用进程。
2.从调用connect以后就不许要再使用recvfrom和sendto函数,可以用read和write函数替代。
3.没有链接的UDP套接口将会接受所有发送到绑定端口的数据(任何一个进程只要向UDP绑定端口发送数据,都会被没有链接的UDP套接口接受),已链接套接口只会接受链接的另一方的数据,不接受其它人发送过来的数据。
注意的就是UDP调用connect没有建立链接。
多次调用connect,一般有2个目的
1.为套接口指定新的IP和端口号
2.断开套接口
第一个目的很简单,填入新的IP和端口即可。第2个只要设置要链接的新套接口的地址族为AF_UNSPEC即可。这可能会返回一个错误,但这不要紧。
一般来说客户端和服务器是多对1关系,所以客户端比较常见调用connect,服务器则不常见(当然这并不是指服务器不可以connect,如果你确定只给某一个客户端服务,则依然可以调用connect)。
已链接套接口相对于未链接套接口在性能上有优势。
未链接UDP套接口:
1.链接套接口
2.输出第一个数据包
3.断开套接口
4.链接套接口
5.输出第2个数据包。
。。。。。。。。。。。
已链接套接口
1.连接套接口。
2.输出第一个数据包
3.输出第2个数据包。
。。。。。。。。。。
n.断开套接口。
已链接的套接口可以通过getsockname来获取地址和端口。
分享到:
相关推荐
5. `socket.connect()`:对于TCP和UDP,连接到指定的服务器地址。 6. `socket.sendall()` 和 `socket.recv()`:分别用于发送和接收数据。 在TCP高级编程中,还需要关注以下几个方面: 1. 非阻塞I/O:通过设置...
4. **连接与接受**:TCP客户端使用`connect()`连接服务器,服务器通过`accept()`接收连接请求并返回新的套接字。 5. **发送与接收数据**:`send()`和`recv()`函数用于TCP和UDP的数据传输。TCP中,数据按流发送,可能...
- `connect()`:对于UDP,此函数不是必须的,但可以用于指定默认的发送目标地址。 - `sendto()`:向指定的远程地址发送数据。 - `recvfrom()`:从任何源接收数据,并获取发送者的地址信息。 - `close()`:关闭套...
主要通过套接字API(socket API)来实现,其中包括socket()函数创建套接字,bind()函数绑定本地端口,connect()或sendto()函数发送数据,以及recvfrom()函数接收数据。 3. UDP客户端(udpcli.c):客户端通常会创建...
《TCP与UDP通讯实例在VC6.0下的实践》 在计算机网络通信中,TCP(传输控制协议)和UDP(用户数据报协议)是两种基本的传输层协议,它们各有特色,广泛应用于各种网络应用程序中。本文将通过一个在VC6.0环境下编写的...
本篇将深入探讨TCP与UDP的高级编程,旨在帮助你理解和实践这两种协议的通信程序。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手建立连接,确保数据的无损传输,并且...
与TCP(Transmission Control Protocol)不同,UDP不提供顺序传输、确认机制、重传或拥塞控制等服务,因此它具有更低的开销和更快的传输速度。这使得UDP成为实时应用如在线音频、视频流和网络电话的理想选择,因为...
UDP(User Datagram Protocol)是网络传输层协议之一,与TCP(Transmission Control Protocol)并行存在。UDP属于无连接协议,不提供数据包顺序保证、错误校正或流量控制,因此它更加轻量级,适用于对实时性要求高的...
client.Connect(new IPEndPoint(IPAddress.Parse("服务器IP"), 服务器端口)); byte[] data = Encoding.UTF8.GetBytes("要发送的数据"); int sent = client.Send(data, data.Length); ``` 接收数据则使用Receive方法...
6. **使用连接**:一旦连接成功,你可以通过`WiFi.localIP()`获取设备的IP地址,并开始使用`WiFiClient`实例进行TCP通信,或者使用`WiFiUDP`进行UDP通信。 这只是一个基本的示例,实际应用可能需要更复杂的错误处理...
与TCP(Transmission Control Protocol)不同,UDP不保证数据包的顺序、完整性和可靠性,而是以尽可能快的速度发送数据,适合对实时性要求较高的应用。在C#中,我们可以利用System.Net.Sockets命名空间中的UdpClient...
1. 调用`socket()`函数,指定协议族(如AF_INET表示IPv4,AF_INET6表示IPv6)、套接字类型(如SOCK_STREAM代表TCP,SOCK_DGRAM代表UDP)和协议(通常为0,让系统选择默认协议)。 2. 使用`bind()`函数将socket与...
【TCP与UDP协议】 在计算机网络通信中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种基本的传输层协议,它们各自有其特点和适用场景。 TCP,即传输控制协议,是一种面向连接的、...
与TCP相比,UDP不提供可靠的连接服务,不保证数据包的顺序到达或错误检测,因此UDP适用于对实时性要求高但对数据完整性要求相对较低的场景,如在线视频流、语音通话等。 在"udp.tar.gz"这个压缩包中,包含的是一个...
首先,创建一个UdpClient实例,然后调用其Connect方法指定远程IP地址和端口号。发送数据时,可以使用Send方法,接收数据则使用Receive方法。注意,由于UDP是无连接的,所以Receive方法可能会接收到任何源地址的数据...
在C#中创建一个UDP客户端,我们需要实例化UdpClient类,并通过Connect方法指定服务器的IP地址和端口号。以下是一个简单的UDP客户端示例: ```csharp using System; using System.Net; using System.Net.Sockets; ...
- 客户端也需要创建一个socket,并且可能需要通过connect函数指定服务器的IP和端口,但这不是必须的,因为UDP是无连接的。 - 客户端通过sendto函数向服务器发送数据,提供服务器的IP和端口以及要发送的信息。 - ...
由于UDP是无连接的,`connect()`操作并不保证数据的到达,但可以提供一个默认的目标地址,使得后续的`sendto()`调用不必每次都指定服务器信息。 4. **接收响应**:客户端也可以使用`recvfrom()`接收服务器的回应,...
本篇将深入讲解C#中实现TCP与UDP助手类的相关知识点,帮助你更好地理解和运用这两种协议。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过建立三次握手来确保连接的可靠性,并且在数据...
`bind()`函数将套接字与特定的IP地址和端口号绑定,`connect()`(对于客户端)或`listen()`(对于服务器)函数准备接收或发送数据,最后`sendto()`和`recvfrom()`用于发送和接收UDP数据报。 2. **IP和端口**:每个...