精华内容
下载资源
问答
  • socket端口数据转发

    万次阅读 2015-05-10 21:17:42
    因工作的需要,别的电脑在访问我的电脑的80端口时,我希望其访问的其实是某台设备的80端口, 因为我的电脑根本没有web服务,提供web服务的其实是某台设备,公司有很多台设备哈。。。 而别的电脑只能访问我的...

    参考文章:http://blog.csdn.net/wangyi_lin/article/details/9277717?utm_source=tuicool

     灵感来源于lcx.exe

    ---------------------------------------------------------------------------

    先说下我的需求:

    因工作的需要,别的电脑在访问我的电脑的80端口时,我希望其访问的其实是某台设备的80端口,

    因为我的电脑根本没有web服务,提供web服务的其实是某台设备,公司有很多台设备哈。。。

    而别的电脑只能访问我的电脑,不能直接访问设备。。。

    为了别的电脑能通过我的电脑访问到设备,因此我写了这个程序。。。

    ------------------------------------------------------------------------------------------------------

    该demo程序我测试了百度、人人网、博客园,都可以通过我的程序进行转发访问,

    说明我的想法真的可以实现了。。。

    为了测试,需要修改以下文件:

    C:\Windows\System32\drivers\etc\hosts

    如我的为:

    192.168.1.3 www.renren.com
    192.168.1.3 www.baidu.com
    192.168.1.3 www.cnblogs.com


    -------------------------------------------------------------------------------------

    程序效果如下:


    -----------------------------------------------------------------------------------------------------------

    关键代码如下:

    // 80端口监听线程
    void CTranspondDlg::ThreadListenPort80( void )
    {
        ShowMessage("进入ThreadListenPort80");
    
        SOCKET skServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (INVALID_SOCKET == skServer)
        {
            ShowMessage("创建socket失败");
            m_bIsStop = true;
        }
        SOCKADDR_IN skSvrAddr;
        skSvrAddr.sin_family = AF_INET;
        skSvrAddr.sin_port = htons(80);
        skSvrAddr.sin_addr.S_un.S_addr = ADDR_ANY;
        if (bind(skServer, (struct sockaddr*)&skSvrAddr, sizeof(skSvrAddr)) == SOCKET_ERROR)
        {
            ShowMessage("80端口绑定socket失败");
            m_bIsStop = true;
        }
        if (listen(skServer, SOMAXCONN) == SOCKET_ERROR)
        {
            ShowMessage("80端口监听socket失败");
            m_bIsStop = true;
        }
        else
        {
            ShowMessage("socket监听80端口成功,等待客户连接...");
        }
    
        CString strLog;
        while(!m_bIsStop)
        {
            if (SOCKET_Select(skServer, 500, TRUE))
            {
                SOCKET skClient;
                int iAddrLen = sizeof(SOCKADDR_IN);
                SOCKADDR_IN skAddrClient;
                skClient = accept(skServer, (sockaddr*)&skAddrClient, &iAddrLen);
                strLog.Format("有客户连接:%s:%d", inet_ntoa(skAddrClient.sin_addr), ntohs(skAddrClient.sin_port));
                ShowMessage(strLog);
    
                // 连接真正的web服务器
                SOCKET skWeb = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
                if (skWeb == skServer)
                {
                    ShowMessage("创建web socket失败");
                    m_bIsStop = true;
                    break;
                }
                SOCKADDR_IN skAddrWeb;
                skAddrWeb.sin_family = AF_INET;
                skAddrWeb.sin_port = htons(80);
                skAddrWeb.sin_addr.S_un.S_addr = inet_addr("180.97.33.108"); // 百度
                //skAddrWeb.sin_addr.S_un.S_addr = inet_addr("220.181.181.224"); // 人人
                //skAddrWeb.sin_addr.S_un.S_addr = inet_addr("42.121.252.58"); // cnblogs
                if (connect(skWeb, (sockaddr*)&skAddrWeb, sizeof(sockaddr)) == SOCKET_ERROR)
                {
                    ShowMessage("连接web服务器失败");
                    m_bIsStop = true;
                    break;
                }
    
                // 开启数据转发线程
                TranspondSocket transpondSocket;
                transpondSocket.pThis = this;
                transpondSocket.skClient = skClient;
                transpondSocket.skServer = skWeb;
                HANDLE hTmp = (HANDLE)_beginthreadex(NULL, 0, ThreadTranspondDataProxy, &transpondSocket, 0, NULL);
                CloseHandle(hTmp);
                hTmp = NULL;
            }
        }
    
        closesocket(skServer);
        ShowMessage("退出ThreadListenPort80");
    }

    ----------------------------------------------------------------
    // 数据转发线程
    void CTranspondDlg::ThreadTranspondData( LPVOID pvParam )
    {
        ShowMessage("进入ThreadTranspondData");
        CString strLog;
        TranspondSocket *pTS = (TranspondSocket*)pvParam;
        if (pTS == NULL)
        {
            ShowMessage("ThreadTranspondData 参数错误");
            ShowMessage("退出ThreadTranspondData");
            return;
        }
    
        // SIO_KEEPALIVE_VALS 机制
        //structtcp_keepalive {
        //    ULONGonoff ;          // 是否开启keepalive
        //    ULONGkeepalivetime ;  // 多长时间(ms)没有数据就开始send心跳包
        //    ULONGkeepaliveinterval ; // 每隔多长时间(ms)send一个心跳包,
        //                             // 发5次(2000 XP 2003默认), 10次(Vista后系统默认)
        //};
        
        //tcp_keepalive inKeepAlive = {0};
        //tcp_keepalive outKeepAlive = {0};
        //unsigned long ulInLen = sizeof(tcp_keepalive);
        //unsigned long ulOutLen = sizeof(tcp_keepalive);
        //unsigned long ulBytesReturn = 0;
        //inKeepAlive.onoff = 1;
        //inKeepAlive.keepaliveinterval = 1000; //单位为毫秒
        //inKeepAlive.keepalivetime = 1000;     //单位为毫秒
        //int iRet = WSAIoctl(pTS->skClient, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen,  (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL);
        //if (iRet != 0)
        //{
        //    strLog.Format("WSAIoctl错误, ErrCode=%d", WSAGetLastError());
        //    ShowMessage(strLog);
        //    ShowMessage("退出ThreadTranspondData");
        //    return;
        //}
        //iRet = WSAIoctl(pTS->skClient, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen,  (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL);
        //if (iRet != 0)
        //{
        //    strLog.Format("WSAIoctl错误, ErrCode=%d", WSAGetLastError());
        //    ShowMessage(strLog);
        //    ShowMessage("退出ThreadTranspondData");
        //    return;
        //}
    
        bool bIsExit = false;
        int iRecvSum = 0;
        int iSendSum = 0;
        char szBuf[4096] = {0};
        DWORD dwErroCode = 0;
        while(!m_bIsStop)
        {
            if (bIsExit)
            {
                break;
            }
            memset(szBuf, 0, sizeof(szBuf));
            iRecvSum = 0;
            iSendSum = 0;
    
            // 接收客户端数据
            while(SOCKET_Select(pTS->skClient, 100, TRUE))
            {
                iRecvSum = recv(pTS->skClient, szBuf, sizeof(szBuf), 0);
                dwErroCode = WSAGetLastError();
    
                // 判断客户端是否断开
                if (WSAGetLastError() == WSAECONNRESET)
                {
                    ShowMessage("客户端断开");
                    bIsExit = true;
                    break;
                }
                if (iRecvSum <= 0)
                {
                    strLog.Format("没有收到服客户端数据:dwErroCode=%d", dwErroCode);
                    ShowMessage(strLog);
                    bIsExit = true;
                    break;
                }
                strLog.Format("收到客户端数据:iReadSum=%d", iRecvSum);
                ShowMessage(strLog);
                strLog.Format("%s", szBuf);
                ShowMessage(strLog);
    
                // 将客户请求的数据发给真正的服务器
                iSendSum = send(pTS->skServer, szBuf, iRecvSum, 0);
                strLog.Format("给服务器发送数据:iSendSum=%d, ErrCode=%d", iSendSum, WSAGetLastError());
                ShowMessage(strLog);
            }
    
            // 接收真正的服务器返回来的数据
            while(SOCKET_Select(pTS->skServer, 100, TRUE))
            {
                iRecvSum = recv(pTS->skServer, szBuf, sizeof(szBuf), 0);
                dwErroCode = WSAGetLastError();
    
                // 判断服务器是否断开
                if (WSAGetLastError() == WSAECONNRESET)
                {
                    ShowMessage("服务器断开");
                    bIsExit = true;
                    break;
                }
    
                if (iRecvSum <= 0)
                {
                    strLog.Format("没有收到服务器数据:dwErroCode=%d", dwErroCode);
                    ShowMessage(strLog);
                    bIsExit = true;
                    break;
                }
                strLog.Format("收到服务器数据:iRecvSum=%d", iRecvSum);
                ShowMessage(strLog);
                strLog.Format("%s", szBuf);
                ShowMessage(strLog);
    
                // 将服务器数据发给客户端
                iSendSum = send(pTS->skClient, szBuf, iRecvSum, 0);
                strLog.Format("发送给客户端数据:iSendSum=%d, ErrCode=%d", iSendSum, WSAGetLastError());
                ShowMessage(strLog);
            }
        }
    
        closesocket(pTS->skClient);
        closesocket(pTS->skServer);
        ShowMessage("退出ThreadTranspondData");
    }


     

    ------------------------------------------------------------------------

    唯一的缺点就是,客户端掉线的检测机制不是很好,留给需要的人去完善吧。。。

    程序VS2010源码工程下载:

     http://download.csdn.net/detail/friendan/8684207

     

     

     

    展开全文
  • 那么到底如何理解输入和输出端口到底是使用reg类型还是wire类型? 如图1 所示,对于输入A和输入B来说,我们只能使用线网类型,但是,输入A和输入B这两个端口可以由寄存器和线网所驱动。也就是说,寄存器和线网...

    在Verilog中如何给端口选择正确的数据类型

    今天要介绍的知识点相信很多同学都已经很清楚了,在这里做介绍只是对我和一些新手做一下知识的巩固。
    那么到底如何理解输入和输出端口到底是使用reg类型还是wire类型?
    图1 实际电路模块图
    如图1 所示,对于输入A和输入B来说,我们只能使用线网类型,但是,输入A和输入B这两个端口可以由寄存器和线网所驱动。也就是说,寄存器和线网可以连接到这两个输入端口作为输入源。对于输出端口Y来讲,可以是线网,也可以是寄存器类型,但是,对于输出端口Y,它只能驱动线网类型。这样说比较抽象,下面我们结合具体的实例进行说明,代码如下:

    module Datatype_eg(
    a,b,c,d,o1,o2
    );
    input a,b,c,d;
    ouput o1,o2;
    
    reg c,d;
    reg o1,o2;
    assign o2=c&&d;
    
    always@(a or b)
    begin
         if(a)
             o1= b;
          else
             o1=1'b0;
    end
    endmodule
    

    在Quartus II上对上述代码进行编译,会显示出以下错误,如图2所示:
    图2  Quartus II的错误提示窗口
    从图2中可知,c不能被声明为reg类型,也就是错误提示中的variable data type,这里为什么会是variable,原因是在新的Verilog-2001标准中,已经没有寄存器类型(register)类型,它们把register改成了variable变量类型,但是一般来说,我们还是比较习惯称为寄存器类型。
    言归正传,为什么c和d不能被定义为寄存器类型,是因为c和d是输入端口,前面已经说过了,输入端口不能定义为寄存器类型,因此c和d只能定义为wire类型。这里进行了代码修改,将reg c和reg d注释掉就可以了,默认的类型就是wire类型。修改完成后,代码仍有错误,如图3所示:
    图3 再次编译后的代码错误提示
    如图3所示,o2必须为线网类型,也许有同学会问,前面说对于输出端口来说,可以是线网,也可以是寄存器类型,为什么在这里输出端口o2必须为线网类型不能为寄存器类型呢?这是因为o2是由关键字assign(连续赋值语句)指定的,必须是wire类型,这一点大家可以记住。那么对于o1必须定义为reg类型的,是由于它是在always块里赋值的。因此,只需要将o2注释掉,编译就没有错误了。
    这里再补充一点:
    图4 数据类型的RTL视图
    如图4所示,尽管我们将o1声明成了reg类型,但是并没有综合成触发器。原因是对于寄存器reg类型,在always等过程中被赋值的信号,如果该always模块中描述的是时序逻辑电路,那么该信号常常被综合为D触发器,如果该always模块中描述的是组合逻辑电路,那么该信号会被综合成连线。

    展开全文
  • 可以正常上网了,连接打印机却出现了故障,总是显示“不支持打印机连接的端口。请检查端口。”不知道这究竟是哪里出了问题?打印机的型号是佳能LBP2900.在网上搜索了一点文字,按照去做,依旧如故,很是困扰。一、...

    可以正常上网了,连接打印机却出现了故障,总是显示“不支持打印机连接的端口。请检查端口。”不知道这究竟是哪里出了问题?打印机的型号是佳能LBP2900.在网上搜索了一点文字,按照去做,依旧如故,很是困扰。一、现象描述电脑和打印机连接提示“无法识别USB设备”,在“设备管理器”显示“Unknown Device”。设备管理器显示二、原因分析1.USB电缆线质量差或者损坏。2.USB端口供电不足,使用USB延长线或者连接电脑前置USB端口,只提供较低电流的供电,计算机在低电流状况下可以检测到设备,但可能无法维持高速通讯。3.驱动程序没有安装或者安装的驱动程序有问题。4.某些电脑的主板对USB2.0 支持性不好。三、解决方法1.购买符合标准的正规USB线,并尽量不要使用USB连接线。2.将数据线连接到电脑的后置USB口不要使用延长线,重新拔插USB线测试。4.在电脑上禁用USB 2.0设备方法一:在“设备管理器”中禁用USB2.0设备。鼠标右键点击“我的电脑”选择“属性”,点击“硬件”再选择“设备管理器”,展开“通用串行总线控制器”右键点击USB2选择“禁用”即可禁用USB 2.0设备;禁用USB2.0设备方法二:在 CMOS 中禁用 USB2.0 Supports。提示:Tip:由于主板的品牌和型号不同进入COMS的方法和界面也有所不同,以下方法仅供参考,具体方法建议查看主板说明书。

    取消

    评论

    展开全文
  • 端口占用 10048的错误处理

    千次阅读 2015-01-23 12:29:15
    端口占用错误 这两天在工作的过程中发现基于socket的网络程序中时不时发生connect()调用失败的错误,通过获取错误码,发现是WSAEADDRINUSE(10048)的错误,MSDN的说明如下:  这种错误常常发生在bind函数中...

    端口占用错误

    这两天在工作的过程中发现基于socket的网络程序中时不时发生connect()调用失败的错误,通过获取错误码,发现是WSAEADDRINUSE(10048)的错误,MSDN的说明如下:     

          这种错误常常发生在bind函数中,当bind已经绑定的端口被占用后,再次绑定同一端口就会发生错误,但这一错误不影响bind的执行,换句话说,bind第二次执行并不发生错误,但是在紧接着调用connect()时会出错,错误码就是10048。       

          应用程序调用bind在使用随机端口绑定时,如果操作系统预留的1024~5000之间的端口都被占用着的话,bind不出错,connect会失败。       

          什么情况下端口会被全部占用?      

          情况一:如果每个端口上都正在进行数据操作,那么端口就都处于占用状态。          

          情况二:connect的频率太快,每一个socket在调用closesocket进行关闭操作后,虽然closesocket执行完毕,但是对应的占用端口并不是立即释放,这些端口需要继续处于占用状态,等待时间大约2ML(数据包最大生存周期),默认最大值为4分钟。用netstat命令查看端口状态,端口显示TIME_WAIT,在4分钟内如果对同一个端口进行connect,就会发生10048错误。     

          如何修正错误?     

         方法一: 如果使用了bind函数,那么可以对绑定的端口进行指定,如果调用connect失败,那么就返回bind处更改绑定端口,然后继续connect,直到成功为止。     

         方法二: 如果没有使用bind函数,直接使用connect进行连接,那么可以对connect操作进行retry,在这种情况下如果connect失败,那么它下次被调用时仍会使用调用失败的端口进行连接,直到连接成功。    

         retry的间隔时间和次数如何确定?     

         理想的设定是retry的间隔时间要尽量短,次数要尽量少,但这两者是相互矛盾的,往往retry的总时间是一定的,也就是说retry的时间间隔短了,次数就多了;retry的时间间隔长了,次数就少了。呵呵,这里感觉很不好选择,那么只有通过实际的程序测试来判断了。


    展开全文
  • 端口号大全

    万次阅读 多人点赞 2019-03-14 08:38:16
    计算机系统“端口”是英文 port 的义译,可以认为是计算机与外界通讯交流的出口。其中 硬件领域的端口又称接口,如:USB 端口、串行端口、打印机端口等。软件领域的端口一般 指网络中面向连接服务和无连接服务的通信...
  • Nginx - 记一次Nginx端口转发失败案例

    千次阅读 2020-09-06 21:31:26
    生产环境F5 后面配置了4个Nginx , F5端口开放了 8585端口 ,用于将请求 问题描述: 原因分析: 提示:这里填写问题的分析: 例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Handler....
  • 1、 在进程中为每个系统定义了一个数字,就是端口,知道数据发送到那个程序中;ip决定发送到哪个电脑。因为不同的电脑程序所在的进程号不同,不能通过进程号来发送。 通过端口进入程序所在的进程。 2、端口号的数值...
  • 端口大全

    千次阅读 多人点赞 2017-11-15 13:35:20
    0端口:无效端口,通常用于分析操作系统1端口:传输...消息发送协议19端口:字符发生器20端口:FTP文件传输协议(默认数据口)21端口:FTP文件传输协议(控制)22端口:SSH远程登录协议23端口:telnet(终端仿真协议),木...
  • ftp列表(数据套接字)错误

    千次阅读 2019-03-11 11:38:51
    错误显示如下 解决方案: 1.打开选项,找到参数选择-连接属性下面的ftp----把数据连接模式改为主动模式就OK了
  • 但一定要注意,接入链路不一定只允许来自一个VLAN的数据帧通过,只是Access端口链路才仅允许一个VLAN数据帧通过,在连接用户主机的Hybrid端口链路上同样允许来自多个VLAN的数据帧(不带标签)通过。 l 干道链路...
  • 常用端口列表

    千次阅读 2020-05-27 14:23:12
    常见端口 ...20|FTP文件传输协议(默认数据口) 21|FTP文件传输协议(控制) 22|SSH远程登录协议 23|telnet(终端仿真协议),木马Tiny Telnet Server开放此端口 24|预留给个人用邮件系统 25|SMTP服务器所...
  • PORT(主动)方式的连接过程是: 客户端向服务器的FTP端口(默认是21)发送连接请求...于是服务器从20端口向客户端的****端口发送连接请求,建立一条数据链路来传送数据。   PASV(被动)方式的连接过程是: 客户
  • 常用端口大全

    万次阅读 多人点赞 2018-08-22 21:58:57
    端口 说明 0 无效端口,通常用于分析操作系统 1 传输控制协议端口服务多路开关选择器 2 管理实用程序 3 压缩进程 5 远程作业登录 7 回显 9 丢弃 11 在线用户 13 时间 17 ...
  • 华为设备端口数据清除

    千次阅读 2011-06-29 11:37:40
    1、华为设备清除端口数据包 <3328-02>reset coun interface Ethernet0/0/27 2、华为设备arp老化时间为20分钟,修改只能在vlan下修改,并且只能对其中的vlan修改。 [3328-01]int vlan 200 [3328-01-vlanif...
  • HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效。环境信息:操作系统:WIndows 7 x64IIS:Internet Information Services 7.5解决方法:web.config文件内容:
  • 最近在做的一个项目使用的是UDP传输,中间出现的...这种情况我发现是我的发送数据端口号和接收数据端口号是同一个端口号的问题,所以在设置端口号时尽量不要设置同一个端口号。 2.端口号被占用的时候,我尝试添加
  • 干货|内网渗透之端口转发&端口映射

    千次阅读 2019-11-09 17:31:29
    端口转发是转发一个网络端口从一个网络端口转发到另一个网络端口或从一个网络节点转发到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内网)上的一个...
  • 所有常用端口作用

    千次阅读 2018-12-12 20:17:53
    所以,在一些使用频率相对较高的端口上,很容易会引发一些由于陌生而出现的错误,或者被黑客利用某些端口进行入侵。对于这件事情,大部分人都很头疼——最多可达65535个的端口,让人怎么记? 别怕,小编专门给大家...
  • 端口服务对照

    千次阅读 2020-03-10 12:31:34
    2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 ... 20端口:FTP文件传输协议(默认数据口) 21端口:FTP文件传输协议(控制) 22端口:SSH远程登录协议 23端口:telnet(终端仿真协议),木马TinyTelnetS...
  • Linux常用与不常用端口一览表

    千次阅读 2020-10-24 16:08:18
    常用端口号: IIS(HTTP):80 SQLServer:1433 Oracle:1521 MySQL:3306 FTP:21 SSH:22 Tomcat:8080 Telnet :23 常用和不常用端口一览表 端口:0 服务:Reserved 说明:通常用于分析操作系统。这一方法能够...
  • 网络常用端口号大全

    万次阅读 多人点赞 2019-06-18 14:13:11
    端口号---具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配(当然,一般在软件编写时就已经定义)。当然,有很多应用软件有公认的默认的端口,比如FTP:20和21,HTTP:80,TELNET...
  • Mac 查看端口占用情况及杀死进程

    万次阅读 2019-03-25 15:55:23
    在开发中经常会遇到端口占用问题,例如下面,npm start 报的错误: 1. 查看端口占用情况命令 lsof -i tcp:8080 输出结果: 字段说明: 字段名 说明 COMMAND 进程名称 PID 进程标识符 USER 进程所有者...
  • TCP端口大全

    千次阅读 2020-04-01 15:55:09
    TCP端口大全,赶紧收藏一下吧。 0 | 无效端口,通常用于分析操作系统 1 | 传输控制协议端口服务多路开关选择器 2 | 管理实用程序 3 | 压缩进程 ...20 | FTP文件传输协议(默认数据口) 21 | FTP文...
  • 不着急,那是因为7777 端口没有接受到数据,下面先暂停程序,我们需要往7777端口数据。 利用socketTextStream()函数,我们可以从指定的主机上某个特定端口接收数据。下面看一下如何在7777端口数据。...
  • nginx 怎么做端口转发

    千次阅读 2020-12-28 23:50:54
    前端项目在http://127.0.0.1:3000/Mook数据的node服务在 http://127.0.0.1:4003/所有的跨域请求接口类似这种http://127.0.0.1:3000/api/activity/list以/api/开头,怎么使用nginx 实现端口转发,解决本地跨域问题?...
  • windows 端口

    千次阅读 2015-03-17 14:21:06
    软件领域的端口 一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。说白了,我们在计算机的 任何操作都在有意无意的使用着计算机的各个...
  • Java开发中常用数据库默认端口oracle 1521 、mysql 3306、sqlserver 1433等,及网络常用端口
  • 所以,在一些使用频率相对较高的端口上,很容易会引发一些由于陌生而出现的错误,或者被***利用某些端口进行***。对于这件事情,大部分人都很头疼——最多可达65535个的端口,让人怎么记?别怕,这次专门给大家整理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 490,826
精华内容 196,330
关键字:

数据端口错误