误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指“Internet 协议”(请参考 RFC-791。) IP 只是处理Internet 路由而已。
那么数据报套接字呢?为什么它叫无连接呢?为什么它是不可靠的呢?有这样的一些事实:如果你发送一个数据报,它可能会到达,它可能次序颠倒了。如果它到达,那么在这个包的内部是无错误的。数据报也使用 IP 作路由,但是它不使用 TCP。它使用“用户数据报协议 (User Datagram Protocol)”,也叫 “UDP” (请参考 RFC-768。)
为什么它们是无连接的呢?主要是因为它并不象流式套接字那样维持一个连接。你只要建立一个包,构造一个有目标信息的IP 头,然后发出去。无需连接。它们通常使用于传输包-包信息。简单的应用程序有:tftp, bootp等等。
你也许会想:“假如数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出的一个被接受到包,收到者必须发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK” 包)。如果在一定时间内(例如5秒),发送方没有收到应答,它将重新发送,直到得到 ACK。这一ACK过程在实现SOCK_DGRAM 应用程序的时候非常重要。
简单的发送和接收实现
服务器端接收代码:
- #include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib")
- #include <stdio.h> #include <memory.h>
- void main()
- { WSAData wsd;
- WSAStartup(MAKEWORD(2,0),&wsd);
- SOCKET s =NULL; s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- struct sockaddr_in ch; memset(&ch,0,sizeof(ch));
- ch.sin_family=AF_INET; ch.sin_addr.s_addr=INADDR_ANY;
- ch.sin_port=htons(1041); int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
- #define QUEUE_SIZE 5 int l=listen(s,QUEUE_SIZE);
- printf("正在监听本机的1041端口!n"); SOCKET sc=accept(s,0,0);
- printf("客户端已经连接到本机的1041端口!n"); #define BUF_SIZE 4096
- int receByt=0; while(1)
- { char buf[BUF_SIZE];
- receByt=recv(sc,buf,BUF_SIZE,0); buf[receByt]='
