1.流程
解决版本问题->设置监听端口和地址->bind,完成后在系统进行监听->循环进行recvfrom接受连接并接受信息
2.简单示例
服务端:
// udp服务端.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<WinSock2.h> #include <stdio.h> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("版本错误\n"); return -1; } int len=sizeof(sockaddr); char recvBuffer[1024]; SOCKET server_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //SOCKET client_socket; SOCKADDR_IN bind_addr; SOCKADDR_IN client_addr; bind_addr.sin_addr.S_un.S_addr = htonl(ADDR_ANY); bind_addr.sin_port = htons(8888); bind_addr.sin_family = AF_INET; //udp进行bind后开始进行侦听 if (bind(server_socket, (const sockaddr*)&bind_addr, sizeof(sockaddr)) == SOCKET_ERROR) { printf("bind error code is %d\n", WSAGetLastError()); return -1; } __try { while (1) { memset(recvBuffer, 0, 1024); recvfrom(server_socket, recvBuffer, 1024, 0, (sockaddr*)&client_addr, &len); printf("receive %s from %s %d\n", recvBuffer, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); } } __except (closesocket(server_socket)) { } WSACleanup(); return 0; }
客户端
#include<WinSock2.h> #include<stdio.h> #include<string.h> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("版本错误\n"); return; } int len = 0; char sendBuffer[1024]; SOCKET client_socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); SOCKADDR_IN client_addr; client_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); client_addr.sin_family = AF_INET; client_addr.sin_port = htons(8888); printf("info : type quit to quit\n"); while (1) { memset(sendBuffer, 0, 1024); printf("输入内容:\n"); scanf("%s", sendBuffer); if (strcmp(sendBuffer, "quit")==0) { printf("quit!\n"); closesocket(client_socket); WSACleanup(); return; } sendto(client_socket, sendBuffer, strlen(sendBuffer), 0, (const SOCKADDR*)&client_addr, &len); } }