• 学习:WinSock UDP 短连接


    服务端:socket -> bind -> sento/recvfrom -> close
    客户端: socket -> sendto/recvfrom -> close


    服务端:

    #include<WinSock2.h>
    #include<iostream>
    #pragma comment(lib, "ws2_32.lib")
    
    using namespace std;
    
    int main(int argc, char * argv[]) {
    	const int BUFSIZE = 1024;
    	SOCKET		ServerSocket;
    	SOCKADDR_IN ServerAddr;
    	SOCKADDR_IN ClientAddr;
    	WSADATA		wsaData;
    	char		buf[BUFSIZE];
    	int ret;
    	
    	if ((ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
    		cout << "WSAStartup调用失败" << endl;
    		return -1;
    	}
    
    	//创建套接字socket
    
    	if((ServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
    		cout << "创建套接字失败" << WSAGetLastError() << endl;
    		WSACleanup();
    		return -1;
    	}
    
    	//绑定套接字
    	ServerAddr.sin_family = AF_INET;
    	ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	ServerAddr.sin_port = htons(atoi(argv[1]));
    	
    	if(bind(ServerSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) {
    		cout << "绑定套接字失败 " << WSAGetLastError() << endl;
    		closesocket(ServerSocket);
    		WSACleanup();
    		return -1;
    	}
    	int ClientLen = sizeof(ClientAddr);
    	cout << "端口:" << argv[1] << "正在接收数据...." << endl;
    	while (true) {
    		//接收数据
    		ZeroMemory(buf, sizeof(buf));
    		if ((ret = recvfrom(ServerSocket, buf, sizeof(buf), 0, (SOCKADDR *)&ClientAddr, &ClientLen)) == SOCKET_ERROR) {
    			cout << "接收数据失败" << WSAGetLastError() << endl;
    			closesocket(ServerSocket);
    			WSACleanup();
    			return -1;
    		}
    		else {
    			//发送数据
    			cout << "服务端: " << buf << endl;
    			sendto(ServerSocket, buf, sizeof(buf), 0, (SOCKADDR *)&ClientAddr, ClientLen);
    		}
    	}
    
    	closesocket(ServerSocket);
    	WSACleanup();
    	return 0;
    }
    

    客户端:

    #include<WinSock2.h>
    #include<iostream>
    #pragma comment(lib, "ws2_32.lib")
    #pragma warning(disable:4996) //忽略旧函数使用缺陷的警告
    
    using namespace std;
    
    int main(int argc, char * argv[]) {
    	const int BUFSIZE = 1024;
    	WSADATA		WSAData;
    	SOCKET		ClientSocket;
    	SOCKADDR_IN ClientAddr;
    	char		buf[BUFSIZE];
    	
    	WSAStartup(MAKEWORD(2, 2), &WSAData);
    
    
    	//创建套接字
    	ClientSocket = socket(AF_INET,SOCK_DGRAM , IPPROTO_UDP);
    	
    	ClientAddr.sin_addr.s_addr = inet_addr(argv[1]);
    	ClientAddr.sin_port = htons(atoi(argv[2]));
    	ClientAddr.sin_family = AF_INET;
    	
    	int ClientAddrLen = sizeof(ClientAddr);
    	//发送数据
    	while (true) {
    		ZeroMemory(buf, sizeof(buf));
    		cout << "客户端: ";
    		cin >> buf;
    		sendto(ClientSocket, buf, sizeof(buf), 0, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr));
    		recvfrom(ClientSocket, buf, sizeof(buf), 0, (SOCKADDR *)&ClientAddr, &ClientAddrLen);
    
    		cout << "服务端: " << buf << endl;
    	}
    
    	closesocket(ClientSocket);
    	WSACleanup();
    	return 0;
    }
    
  • 相关阅读:
    vue简单分屏(1,4,9,16),全屏,还需要调整
    vue 中的Vuex实践
    常用工具类
    java Log日志规范
    spring中对象的注入方式
    不恰当的update语句使用主键和索引导致mysql死锁
    JPA规范及其它持久层框架
    webservice基本功能介绍
    Activiti工作流(二)之常用操作
    Activiti工作流(一)之基本操作介绍
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12177554.html
Copyright © 2020-2023  润新知