网络编程第三讲UDP编写
一丶UDP简介
UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP
UDP不需要建立建立. 下面有UDP编写流程图
下图为TCP 跟UDP的区别.
UDP下收发函数有区别.
发送数据: TCP: send UDP sendto
接受数据:TCP: recv UDP recvfrom
二丶UDP编写的完整代码
服务端:
#include <stdio.h> #include <winsock2.h> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") #define PORT 6000 int main(int argc, char* argv[]) { //初始化网络环境 WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("WSAStartup failed "); return -1; } //建立一个UDP的socket SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == SOCKET_ERROR) { printf("create socket failed "); return -1; } //绑定地址信息 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr)); char buf[512]; while (TRUE) { memset(buf, 0, 512); // 网络节点的信息,用来保存客户端的网络信息 sockaddr_in clientAddr; memset(&clientAddr, 0, sizeof(sockaddr_in)); int clientAddrLen = sizeof(sockaddr); //接收客户端发来的数据 int ret = recvfrom(sock, buf, 512, 0,(sockaddr*) &clientAddr,&clientAddrLen ); printf("Recv msg:%s from IP:[%s] Port:[%d] ", buf,inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port)); // 发一个数据包返回给客户 sendto(sock, "Hello World!", strlen("Hello World!"), 0, (sockaddr*)&clientAddr, clientAddrLen); printf("Send msg back to IP:[%s] Port:[%d] ", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port)); } return 0; }
客户端
#include <stdio.h> #include <winsock2.h> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") #define PORT 6000 int main(int argc, char* argv[]) { //初始化网络环境 WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("WSAStartup failed "); return -1; } //建立一个UDP的socket SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sockClient == INVALID_SOCKET) { printf("create socket failed "); return -1; } // 申明一个网络地址信息的结构体,保存服务器的地址信息 sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); char buf[] = "client test!"; //发送数据 int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR)); if (dwSent == 0) { printf("send %s failed ", buf); return -1; } printf("send msg:%s ", buf); char recvBuf[512]; memset(recvBuf, 0, 512); sockaddr_in addrSever = { 0 }; int nServerAddrLen=sizeof(sockaddr_in); // 接收数据 int dwRecv = recvfrom(sockClient, recvBuf, 512, 0, (SOCKADDR *)&addrSever,&nServerAddrLen); printf("Recv msg from server : %s ", recvBuf); //关闭SOCKET连接 closesocket(sockClient); //清理网络环境 WSACleanup(); system("pause"); return 0; }