zoukankan      html  css  js  c++  java
  • Winsock编程基础2(UDP流程)

    UDP用户数据报协议
    服务器端
      <1 创建套接字(socket)
      <2 绑定IP地址和端口(bind)
      <3 收发数据(sendto, recvfrom)
      <4 关闭连接(closesocket)
    客户端
      <1 创建套接字(socket)
      <2 收发数据(sendto, recvfrom)
      <3 关闭连接(closesocket)
    int sendto(
        SOCKET s,    //用来发送数据的套接字
        const char FAR *buf,    //指向发送数据的缓冲区
        int len,    //要发送数据长度
        int flags,    //一般指定0
        const struct sockaddr *to,    //指向一个包含目标地址和端口号的sockaddr_in结构
        int toLen    //结构大小
    );
    int recvfrom(SOCKET s, char *FAR buf, int len, int flags, struct sockaddr FAR *from, int FAR* fromLen)
    简单实例
       服务器端
    #include <iostream>
    #include <stdio.h>
    
    #include "InitSock.h"
    
    using namespace std;
    int main(void)
    {
        CInitSock initSock;
        //创建套接字
        SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET)
        {
            cout << "Failed socke()" << endl;
            return 0;
        }
    
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(4567);
        addr.sin_addr.S_un.S_addr = INADDR_ANY;
    
        //绑定套接字到一个本地地址
        if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
        {
            cout << "Failed bind()" << endl;
            return 0;
        }
    
        //接收数据
        char buf[1024];
        sockaddr_in clientAddr;
        int nLen = sizeof(addr);
        while (TRUE)
        {
            int nRecv = recvfrom(s, buf, 1024, 0, (sockaddr*)&clientAddr, &nLen);
            if (nRecv > 0)
            {
                buf[nRecv] = '\0';
                cout << "接收到数据" << inet_ntoa(clientAddr.sin_addr) << ": " << buf << endl;
            }
        }
    
        //关闭套接字
        closesocket(s);
        return 0;
    }
       客户端
    #include <iostream>
    #include <stdio.h>
    
    #include "InitSock.h"
    
    using namespace std;
    int main(void)
    {
        CInitSock initSock;
        //创建套接字
        SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET)
        {
            cout << "Failed socke()" << endl;
            return 0;
        }
        //创建套接字之后如果首先sendto可以不绑定
        //若首先recvfrom则需要绑定
    
        //填写远程地址信息
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(4567);
        addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    
        //发送数据
        char szText[] = "UDP Server Demo\r\n";
        sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
        closesocket(s);
    
        cout << "数据已发送" << endl;
        getchar();
        return 0;
    }
     
     
  • 相关阅读:
    Spring Boot 2.3.0 正式发布!
    当互联网码农遇见国企老同学
    GitHub发布重大更新,关系到所有程序员!
    开发者被要求向破解者道歉,竟揪出“阿里云假员工”,网友:这人有前科
    等了整整12年!Linux QQ 终于更新了!
    我的电脑不联网,很安全,黑客:你还有风扇呢
    grpc的简单用例 (golang实现)
    grpc的简单用例 (C++实现)
    redis键过期 (redis 2.6及以上)
    安装folly库以及folly的ConcurrentHashMap的简单使用
  • 原文地址:https://www.cnblogs.com/chenxingyang/p/9747930.html
Copyright © 2011-2022 走看看