zoukankan      html  css  js  c++  java
  • 学习: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;
    }
    
  • 相关阅读:
    ethcoax_net 模型学习笔记(翻译自OPNET help)
    第一堂课学习
    (2)Dojo学习之模块化
    金融业的电子商务之路
    浅谈PE(私募股权)业务及系统建设:01. 业务介绍
    Don’t Be Afraid to Break Things
    基于Asp.net MVC的系统架构
    思考项目成功的关键因素
    金融业务系统中的数据库事务:01. 五类问题
    金融业务系统中的数据库事务:02. 解决问题
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12177554.html
Copyright © 2011-2022 走看看