zoukankan      html  css  js  c++  java
  • C++Socket编程—UDP通信

    一.socket编程-套接字编程——UDP通信

        UDP,用户数据报协议(UDP,User Datagram Protocol),UDP是面向无连接协议,面向无连接的意思是只有“传送数据”的过程,提供面向事务的简单不可靠信息传送服务。
        即使是在网络拥堵的过程中,UDP也无法进行流量控制等避免网络拥塞,传输过程种丢包,UDP也不负责重发,甚至出现包的到达顺序乱掉的情况也无法纠正。
        UDP往往可以用于以下情况:
        • 包总量较少的通信(DNS,SNMP)
        • 视频,音频多媒体通信(即时通讯)
        • 广播通信

    UDP编程模型:

     二、UDP编程步骤:

    1.初始化WASD

    2.创建socket,指明使用的协议

    3.收发数据

    三、代码示例——使用UDP进行通信:

    发数据端:

    	//初始化
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	int err;
    	wVersionRequested = MAKEWORD(2, 2);
    	err = WSAStartup(wVersionRequested, &wsaData);
    	if (err != 0) {
    		return 1;
    	}
    
    	if (LOBYTE(wsaData.wVersion) != 2 ||
    		HIBYTE(wsaData.wVersion) != 2) {
    		WSACleanup();
    		return 1;
    	}
    
    	//1. 创建socket, 指明要使用的协议什么
    	SOCKET sock = socket(
    		AF_INET,	//ipv4协议族
    		SOCK_DGRAM, //数据报
    		IPPROTO_UDP);//udp协议
    	if (sock == INVALID_SOCKET)
    	{
    		printf("创建socket失败 
    ");
    		return 0;
    	}
    
    
    	//3. 发数据
    	sockaddr_in siTo;
    	siTo.sin_family = AF_INET;
    	siTo.sin_port = htons(9527);
    	siTo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    
    	char szBuff[0x1000] = {"hello socket" };
    	int nBytesSend = sendto(sock,
    		szBuff,
    		sizeof(szBuff),
    		0,
    		(sockaddr*)&siTo, //客户端的的目标地址和端口
    		sizeof(siTo));
    
    	if (nBytesSend == SOCKET_ERROR)
    	{
    		closesocket(sock);
    		printf("接受数据失败 
    ");
    		return 0;
    	}
    
    
    	//接收数据
    	sockaddr_in siRecv;
    	int nSizeOfSiRecv = sizeof(siRecv);
    	char szBuff0[MAXWORD + 1] = { 0 };
    	int nBytesRecv = recvfrom(sock,
    		szBuff0,
    		sizeof(szBuff0),
    		0,
    		(sockaddr*)&siRecv,
    		&nSizeOfSiRecv);
    	if (nBytesRecv == SOCKET_ERROR)
    	{
    		closesocket(sock);
    		printf("接受数据失败 
    ");
    		return 0;
    	}
    
    
    	//清理
    	WSACleanup();
    
    return 0;
    

     收数据端:

    //初始化
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
    	return 1;
    }
    
    if (LOBYTE(wsaData.wVersion) != 2 ||
    	HIBYTE(wsaData.wVersion) != 2) {
    	WSACleanup();
    	return 1;
    }
    
    //1. 创建socket, 指明要使用的协议什么
    SOCKET sock = socket(
    	AF_INET,	//ipv4协议族
    	SOCK_DGRAM, //数据报
    	IPPROTO_UDP);//udp协议
    
    if (sock == INVALID_SOCKET)
    {
    	printf("创建socket失败 
    ");
    	return 0;
    }
    
    //2.绑定端口,指明本进程端口是什么
    sockaddr_in si;
    si.sin_family = AF_INET;
    si.sin_port = htons(9527);//0x3725;
    
    si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//0x0100007f; //127.0.0.1
    
    int nRet = bind(sock, (sockaddr*)&si, sizeof(si));
    if (nRet == SOCKET_ERROR)
    {
    	printf("端口绑定失败
    ");
    	closesocket(sock);
    	return 0;
    }
    //3.收数据
    	sockaddr_in siRecv;
    	int nSizeOfSiRecv = sizeof(siRecv);
    
    	char szBuff[MAXWORD] = { 0 };
    	int nBytesRecv = recvfrom(sock,
    		szBuff,
    		sizeof(szBuff),
    		0,
    		(sockaddr*)&siRecv,
    		&nSizeOfSiRecv
    	);
    
    	if (nBytesRecv == SOCKET_ERROR)
    	{
    		closesocket(sock);
    		printf("接受数据失败
    ");
    	}
    
    
    	//清理
    WSACleanup();
    
  • 相关阅读:
    内存溢出
    3.设计模式----TemplateMethod模式
    tomcat 编码问题
    ibatis实现Iterate的使用 (转)
    2.设计模式---Adapter模式
    1.设计模式-------Iterator
    PHP 下载远程图片
    mysql调优 参数说明
    mySQL内存及虚拟内存优化设置
    Firebug入门指南
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/12797915.html
Copyright © 2011-2022 走看看