基于UDP(面向无连接)的socket编程
一.基于UDP(面向无连接)的socker编程的服务器端(也叫接收端)程序流程如下:
(1) 创建套接字(socket)
(2) 将套接字绑定到一个本地地址和端口上(bind)
(3) 等待接收数据(recvfrom)
(4) 关闭套接字
二. 基于UDP(面向无连接)的socket编程的客户端程序流程如下:
(1)创建套接字(socket)
(2)向服务器发送数据(sendto)
(4)关闭套接字
三. 实现举例
服务器端:
- #include <WINSOCK2.H>
- #include <stdio.h>
- void main()
- {
- //加载套接字库
- WORD wVersionRequest;
- WSADATA wsData;
- int err;
- wVersionRequest = MAKEWORD(1,1);
- err = WSAStartup(wVersionRequest,&wsData);
- if (err != 0)
- {
- return;
- }
- if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion) != 1)
- {
- WSACleanup();
- return;
- }
- //创建套接字
- SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
- SOCKADDR_IN addrSrv;
- addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- addrSrv.sin_family = AF_INET;
- addrSrv.sin_port = htons(6000);
- //绑定套接字
- bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
- //等待并接受数据
- SOCKADDR_IN addrClient;
- int len = sizeof(SOCKADDR);
- char recvBuf[100]; //存储接收的数据
- recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
- printf("%s\n", recvBuf);
- //关闭套接字
- closesocket(sockSrv);
- WSACleanup();
- }
客户端
- #include <WINSOCK2.H>
- #include <stdio.h>
- void main()
- {
- //加载套接字库
- WORD wVersionRequest;
- WSADATA wsData;
- int err;
- wVersionRequest = MAKEWORD(1,1);
- err = WSAStartup(wVersionRequest,&wsData);
- if (err != 0)
- {
- return;
- }
- if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion) != 1)
- {
- WSACleanup();
- return;
- }
- //创建套接字
- SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
- SOCKADDR_IN addrSrv;
- addrSrv.sin_family = AF_INET;
- addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- addrSrv.sin_port = htons(6000);
- //发送数据
- sendto(sockClient, "Hello", strlen("Hello")+1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
- //关闭套接字
- closesocket(sockClient);
- WSACleanup();
- }