zoukankan      html  css  js  c++  java
  • windows网络编程-2015.12.29

    在windows环境下,使用netstat命令查看网络状态,具体命令如下所示:

    netstat -ano | findstr listenport

    在windows环境下,创建udp程序接收端,具体代码如下:

    // Command line options:
    //    udp_server [-i:IP] [-p:port]
    //           -i:IP    Local IP address to listen on
    //           -p:int   Local port
    
    #include <string>
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #pragma comment(lib, "ws2_32.lib")
    
    const int DEFAULT_BUFFER_LENGTH = 4096;
    
    void Usage()
    {
        printf("usage: udp_server [-i:IP] [-p:port]
    ");
        printf("       -i:IP    Local IP address to listen on
    ");
        printf("       -p:int   Local port
    ");
        ExitProcess(1);
    }
    
    struct AddrInfo
    {
        std::string ip;
        int port;
    };
    
    AddrInfo GetInputAddrInfo(int argc, char **argv)
    {
        if(argc < 3)
        {
            Usage();
        }
    
        AddrInfo addrInfo;
        for(int i = 1; i < argc; i++)
        {
            if ((argv[i][0] == '-'))
            {
                switch (tolower(argv[i][1]))
                {
                case 'p':   //port
                    if (strlen(argv[i]) > 3)
                    {
                        addrInfo.port = atoi(&argv[i][3]);
                    }
                    break;
                case 'i':    //ip
                    if (strlen(argv[i]) > 3)
                    {
                        addrInfo.ip = std::string(&argv[i][3]);
                    }
                    break;
                default:
                    Usage();
                    break;
                }
            }
        }
        return addrInfo;
    }
    
    int main(int argc, char **argv)
    {
        AddrInfo addrInfo = GetInputAddrInfo(argc, argv);
    
        WSADATA wsd;
        if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
        {
            printf("WSAStartup failed!
    ");
            return 1;
        }
    
        SOCKET s;
        if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
        {
            printf("socket() failed; %d
    ", WSAGetLastError());
            return 1;
        }
    
        SOCKADDR_IN local;
        local.sin_family = AF_INET;
        local.sin_port = htons((short)addrInfo.port);
        local.sin_addr.s_addr = inet_addr(addrInfo.ip.c_str());
    
        if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
        {
            printf("bind() failed: %d
    ", WSAGetLastError());
            return 1;
        }
    
        char* recvBuf = (char*)malloc(DEFAULT_BUFFER_LENGTH);
        if (recvBuf == NULL)
        {
            printf("GlobalAlloc() failed: %d
    ", GetLastError());
            return 1;
        }
    
        SOCKADDR_IN sender;
    
        while(true)
        {
            int sendSize = sizeof(SOCKADDR_IN);
            int ret = recvfrom(s, recvBuf, DEFAULT_BUFFER_LENGTH, 0, (SOCKADDR *)&sender, &sendSize);
            if (ret == SOCKET_ERROR)
            {
                printf("recvfrom() failed; %d
    ", WSAGetLastError());
                break;
            }
            else if (ret == 0)
            {
                break;
            }
            else
            {
                recvBuf[ret] = '';
                printf("[%s] send me [%s]
    ", inet_ntoa(sender.sin_addr), recvBuf);
            }
        }
    
        closesocket(s);
        free(recvBuf);
        WSACleanup();
        return 0;
    }
     

    运行上述程序,使用命令netstat -ano | findstr 8888,获得如下输出结果:

    QQ截图20151229161057

    按照相同步骤,创建udp程序发送端,具体代码如下:

    // Command line options:
    //    udp_client [-r:IP] [-p:port]
    //           -r:IP    Recipient's IP address
    //           -p:int   Remote port
    //           -n:x     Number of times to send message
    
    #include <string>
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #pragma comment(lib, "ws2_32.lib")
    
    const char SEND_MESSAGE[] = "Hello world!";
    
    void Usage()
    {
        printf("usage: udp_client [-r:IP] [-p:port] [-n:x]
    ");
        printf("       -r:IP    Recipient's IP address
    ");
        printf("       -p:int   Remote port
    ");
        printf("       -n:x     Number of times to send message");
        ExitProcess(1);
    }
    
    struct InputInfo
    {
        std::string ip;
        int port;
        int sendTimes;
    };
    
    InputInfo GetInputInfo(int argc, char **argv)
    {
        if(argc < 4)
        {
            Usage();
        }
    
        InputInfo inputInfo;
        for(int i = 1; i < argc; i++)
        {
            if ((argv[i][0] == '-'))
            {
                switch (tolower(argv[i][1]))
                {
                case 'p':   //port
                    if (strlen(argv[i]) > 3)
                    {
                        inputInfo.port = atoi(&argv[i][3]);
                    }
                    break;
                case 'r':    //ip
                    if (strlen(argv[i]) > 3)
                    {
                        inputInfo.ip = std::string(&argv[i][3]);
                    }
                    break;
                case 'n':   //Number of times to send message
                    if (strlen(argv[i]) > 3)
                    {
                        inputInfo.sendTimes = atol(&argv[i][3]);
                    }
                    break;
                default:
                    Usage();
                    break;
                }
            }
        }
    
        return inputInfo;
    }
    
    int main(int argc, char **argv)
    {
        InputInfo inputInfo = GetInputInfo(argc, argv);
    
        WSADATA wsd;
        if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
        {
            printf("WSAStartup failed!
    ");
            return 1;
        }
    
        SOCKET s;
        if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
        {
            printf("socket() failed; %d
    ", WSAGetLastError());
            return 1;
        }
    
        SOCKADDR_IN recipient;
        recipient.sin_family = AF_INET;
        recipient.sin_port = htons((short)inputInfo.port);
        recipient.sin_addr.s_addr = inet_addr(inputInfo.ip.c_str());
    
        for(int i = 0; i < inputInfo.sendTimes; ++i)
        {
            int ret = sendto(s, SEND_MESSAGE, strlen(SEND_MESSAGE), 0, (SOCKADDR*)&recipient, sizeof(recipient));
            if(ret == SOCKET_ERROR)
            {
                printf("sendto() failed, %d
    ", WSAGetLastError());
                break;
            }
            else if(ret == 0)
            {
                break;
            }        
            else
            {
                printf("send [%s] to [%s]
    ", std::string(SEND_MESSAGE, ret).c_str(), inet_ntoa(recipient.sin_addr));
            }
        }
    
        closesocket(s);
        WSACleanup();
        return 0;
    }
  • 相关阅读:
    Ceph 知识摘录(常见故障、可用性测试)
    Ceph 知识摘录(核心组件、概要)
    Ceph 知识摘录(特点、与传统存储区别)
    服务器证书安装配置指南(IIS7.5) 分类: ASP.NET 2014-11-05 12:39 105人阅读 评论(0) 收藏
    使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏
    Win7设置承载网络 分类: 网络 2014-10-30 09:08 105人阅读 评论(0) 收藏
    Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 中文帮助文档 分类: ASP.NET 2014-10-28 14:09 177人阅读 评论(1) 收藏
    Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 英文帮助文档 分类: ASP.NET 2014-10-28 10:50 147人阅读 评论(1) 收藏
    python之再学习----简单的文件
    python之再学习----简单的类(1)
  • 原文地址:https://www.cnblogs.com/zhouLee/p/5086029.html
Copyright © 2011-2022 走看看