精华内容
下载资源
问答
  •  误区一:TCP服务器accept得到一个新套接字描述符,这个新套接字描述符需要占用一个新的TCP端口。  误区二:TCP服务器fork一个新进程后,两个进程共享已有套接字描述符,那么两个进程可以同时读取到这个套接...

        TCP服务器中,多进程并发模式算是比较常见的服务器范式,然而关于这个范式,自己却在很长时间里存在这样两个误区:

        误区一:TCP服务器accept得到一个新的套接字描述符,这个新的套接字描述符需要占用一个新的TCP端口。

        误区二:TCP服务器fork一个新进程后,两个进程共享已有套接字描述符,那么两个进程可以同时读取到这个套接字中接收到的所有数据,即每个进程都是以复制的形式读取,类似于原始套接字的工作模式。

        关于误区一,主要是自己一直以来有这样一个错误的印象:系统是通过端口号来区分数据的目的地的,并且对应于每一个端口号,都有一个接收缓冲区。在《Unix网络编程》一书中有这样一段话:TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点。它必须查看套接字对的所有4个元素才能确定由哪个端点接收某个到达的分节。就是这句话让我对自己一直以来的错误认识产生了怀疑。事实情况是,TCP服务器在accept后产生一个新的套接字描述符,但这个新产生的套接字依然使用的是监听套接字的端口号!

        关于误区二,自己是理所当然的认为如果要使两个进程都显示同一组数据,那当然要每个进程只读取一个备份了。这很大原因是自己将原始套接字的工作模式套到TCP上了。让自己产生疑问是基于这样一个考虑:假设进程A和进程B共享套接字描述符S,那么假如进程A读取数据,而进程B却不读取数据,如果有一个进程C向这个套接字持续发送数据,那么接收缓冲区不是很快就满了?也就是说进程B拖了进程A的后腿,让进程A没办法再接收新的数据!这肯定是不合理的。所以我自己写了代码验证了一下,事实是:线程A和线程B共享一个接收缓冲区,任何一个线程从缓冲区中取走数据都会导致其他线程无法再接收到该数据。

        下面是我对这两个问题的验证代码:

         服务器端:

    extern "C"
    {
    #include "../unp.h"
    }
    
    int main(int argc, char **argv)
    {
        struct sockaddr_in sockServ, sockCli;
        socklen_t len = sizeof(sockServ);
        memset(&sockServ, 0, sizeof(sockServ));
        sockServ.sin_family = AF_INET;
        sockServ.sin_port = htons(8000);
        sockServ.sin_addr.s_addr = htonl(INADDR_ANY);
    
        int listenfd = socket(AF_INET, SOCK_STREAM, 0);
        bind(listenfd, (struct sockaddr *)&sockServ, len);
        listen(listenfd, 10);
        while(1)
        {
            len = sizeof(sockCli);
            int connfd = accept(listenfd, (sockaddr *)&sockCli, &len);
            int pid = fork();
            if(pid == 0)
            {
                close(listenfd);
                struct sockaddr_in sockTemp;
                socklen_t sockLen = sizeof(sockTemp);
                getsockname(connfd, (sockaddr *)&sockTemp, &sockLen);
                printf("local port: %d\n", htons(sockTemp.sin_port));
                char strTemp[1];
                while(1)
                {
                    int ret = recv(connfd, strTemp, sizeof(strTemp), 0);
                    if(ret == 1)
                        printf("child recv char : %c \n", strTemp[0]);
                    else
                        break;
                }
    
                close(connfd);
                exit(0);
            }
            char strTemp[1];
            int i = 5;
            while(i--)
            {
                int ret = recv(connfd, strTemp, sizeof(strTemp), 0);
                if(ret == 1)
                    printf("parent recv char : %c \n", strTemp[0]);
                else
                    break;
            }
            close(connfd);
        }
    }
    
    //客户端
    extern "C"
    {
    #include "../unp.h"
    }
    
    int main(int argc, char **argv)
    {
        struct sockaddr_in sockServ;
        socklen_t   len = sizeof(sockServ);
        memset(&sockServ, 0, sizeof(sockServ));
        sockServ.sin_family = AF_INET;
        sockServ.sin_addr.s_addr = inet_addr("127.0.0.1");
        sockServ.sin_port = htons(8000);
    
        int connfd = socket(AF_INET, SOCK_STREAM, 0);
        connect(connfd, (sockaddr *)&sockServ, len);
        int nReturn = send(connfd, "123456789", 10, 0);
        printf("write %d \n", nReturn);
        if(nReturn == -1)
            printf("errno: %d \n", errno);
        close(connfd);
        return 0;
    }
    

        上面的代码中自己使用了Stevens书中提供的头文件,但是没有使用他提供的包裹函数,所以只要包含上述代码中需要用到的头文件就可以了。
        上面的代码中通过getsockname取得了accept产生的connfd的本地套接字地址,通过输出端口可以知道,connfd使用的也是8000端口,证实了第一个误区。

        客户端发送了10个字节的数据。主进程接收5个字节,子进程接收剩余的所有数据。输出结果如下:

    parent recv char : 1 
    parent recv char : 2 
    parent recv char : 3 
    parent recv char : 4 
    parent recv char : 5 
    local port: 8000
    child recv char : 6 
    child recv char : 7 
    child recv char : 8 
    child recv char : 9 
    child recv char :  

        通过输出可以知道,子进程只接收到了剩余的5个字节。这证实了第二个误区。

    展开全文
  • 常见socket读写异常及错误

    千次阅读 2015-08-10 16:43:55
    EAGAIN的错误:一般是对非阻塞端口读写产生的错误。 1、发送产生:发送缓冲区剩余空间小于发送包大小。可以通过修改 tcp_sendspace,使之大于send中size参数 ---no -p -o tcp_sendspace=65536  2、...
    EAGAIN的错误:一般是对非阻塞端口读写产生的错误。

    1、发送产生:发送缓冲区剩余空间小于发送包大小。可以通过修改 tcp_sendspace,使之大于send中的size参数   ---no -p -o tcp_sendspace=65536 
    2、接收产生:errno代码为11,算是异常,等待再次触发读取。

    EINTR:errno=4,错误描述Interrupted system call,操作也应该继续。

    ECONNABORTED
              该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用accept。

    ECONNRESET 不在TCP_SYN_SENT状态收到的rst
              该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户 TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN (如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的 EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错误。

    EPIPE 
              错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。

    ECONNREFUSED

            在TCP_SYN_SENT状态收到的rst,一般说明对方没有对应的监听服务。

    ETIMEDOUT
              错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。

    EHOSTTUNREACH   ENETUNREACH

    no route to host(软错)路由上引发了一个目的地不可达的ICMP错误 其中(1)(3),客户端会进行定时多次重试,一定次数后才返回错误。

    RST:产生条件

    1、服务器收到SYN,但没有对应监听服务,返回RST。这时客户端返回 ECONNREFUSED,三次握手失败。

    2、TCP想取消一个已有连接。收到方返回 ECONNRESET 。

    3、TCP收到一个根本不存在连接的分节。可能是服务器重启了,丢失之前已经连接信息。收到方返回 ECONNRESET 。
    展开全文
  • EAGAIN的错误:一般是对非阻塞端口读写产生的错误。1、发送产生:发送缓冲区剩余空间小于发送包大小。可以通过修改 tcp_sendspace,使之大于send中size参数 ---no -p -o tcp_sendspace=655362、接收产生:errno...

    EAGAIN的错误:一般是对非阻塞端口读写产生的错误。

    1、发送产生:发送缓冲区剩余空间小于发送包大小。可以通过修改 tcp_sendspace,使之大于send中的size参数   ---no -p -o tcp_sendspace=65536

    2、接收产生:errno代码为11,算是异常,等待再次触发读取。

    EINTR:errno=4,错误描述Interrupted system call,操作也应该继续。

    ECONNABORTED

    该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用accept。

    ECONNRESET 不在TCP_SYN_SENT状态收到的rst

    该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户 TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN (如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的 EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错误。

    EPIPE

    错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。

    ECONNREFUSED

    在TCP_SYN_SENT状态收到的rst,一般说明对方没有对应的监听服务。

    ETIMEDOUT

    错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。

    EHOSTTUNREACH   ENETUNREACH

    no route to host(软错)路由上引发了一个目的地不可达的ICMP错误 其中(1)(3),客户端会进行定时多次重试,一定次数后才返回错误。

    RST:产生条件:

    1、服务器收到SYN,但没有对应监听服务,返回RST。这时客户端返回 ECONNREFUSED,三次握手失败。

    2、TCP想取消一个已有连接。收到方返回 ECONNRESET 。

    3、TCP收到一个根本不存在连接的分节。可能是服务器重启了,丢失之前已经连接信息。收到方返回 ECONNRESET 。

    展开全文
  • 帆软报表FineReport客户端连接SQLServer(2000、2005等),常常会出现如下错误:com.microsoft.sqlserver.jdbc.SQLServerException: 到主机的TCP/IP 连接失败。 该错误可能由如下几个方面导致: 2. URL是否...

    1. 问题描述

    帆软报表FineReport客户端连接SQLServer(2000、2005等),常常会出现如下错误:com.microsoft.sqlserver.jdbc.SQLServerException: 到主机的TCP/IP 连接失败。 该错误可能由如下几个方面导致:

    2. URL是否正确

    首先确认在定义数据连接那边的URL是否正确(保证IP,端口以及数据库是正确的),如下图:


    3. sp4安装包有没有装

    这个主要是sqlserver2000,其他版本一般没有这个问题。sqlsp4补丁就是Microsoft SQL Server 2000 Service Pack 4 ,大多数版本为简体中文版。

    SP4 包括用于以下 SQL Server 2000 组件的程序包。

    数据库组件(下载文件:SQL2000-KB884525-SP4-x86.EXE):更新 SQL Server 2000 的 32 位数据库组件,包括数据库引擎、复制、客户端连接组件和工具。

    Analysis Services 组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE):更新 SQL Server 2000 的 32 位 Analysis Services 组件。

    SQL Server 2000 Desktop Engine (MSDE) 组件(下载文件:SQL2000.MSDE-KB884525-SP4-x86.EXE):对于 SQL Server 2000 的 32 位 MSDE 组件:

    安装新的 MSDE 实例;

    升级现有 MSDE 实例;

    更新使用合并模块的应用程序。

    打sp4后一般会出现登陆连接问题,看看SQL的服务有没有运行,没运行就去我的电脑>管理>服务里面,把MSSQLSERVER服务登录的用户名和密码改正确;有运行,进企业管理器,改SQL的登录方式为混合模式,设置sa密码,重新设置一次。 sqlserver 2000 sp3由于有bug,很多服务器打不了补丁,说sa连接失败,所以直接安装sp4升级补丁,升级之前建议先备份数据库。

    4. 数据库端的TCP/IP有没有启动

    SQLServer2005默认情况下是已禁用TCP/IP连接,若连接SQLServer数据库出现TCP/IP连接失败,请确认数据库服务器的TCP/IP是否已启用。

    SQLServer2000数据库启用方法:可以到系统服务里手动开启一下,下图所示位置的TCP/IP:


    SQLServer2005数据库启用方法:在Microsoft SQL Server 2005\配置工具\目录下的SQL Server Configuration Manager界面设置,如下图:


    如果提示不监听1433端口,则可以右击TCP/IP属性,弹出对话框中修改IP2默认TCP动态端口,把0改成1433就可以成功访问到1433了。


    5. 服务器网络实用工具中TCP/IP协议有没有打开

    如下图所示,在SQLServer2000中有个服务器网络实用工具需要如下设置,如果不打开也会报TCP/IP的错误,这也是一个要注意的地方,检错的时候不可遗漏。


    对于SQLServer2005,可以在配置工具\SQL Server 外围应用配置器,在“SQL Server 2005外围应用配置器”页,单击“服务和连接的外围应用配置器”,然后单击展开“数据库引擎”,选中“远程连接”,在右边选中“本地连接和远程连接”,再选择要使用的协议:


    6. 防火墙有没有阻止

    控制面板中的Windows防火墙阻止了连接,导致TCP/IP连接失败;本地的防火墙添加一下SQLServer数据库的端口即可:


    注:以上是五种常见的解决方案,出现TCP/IP连接失败的情况,可以按照这五个方法尝试解决。

     

    展开全文
  • 问题出在Tomcat的8009端口错误的提示是8009端口上运行着tcp协议。 修复方案: 解决办法: 只能是通过关闭8009端口来实现 Apache JServ protocol = AJP 解决方案:修改tomcat 的service.xml配置文件 将 <...
  • 1.问题描述帆软报表FineReport连接SQLServer(2000、2005等),常常会出现如下错误:com.microsoft.sqlserver.jdbc.SQLServerException:到主机的TCP/IP连接失败。该错误可能由如下几个方面导致:2.URL是否正确首先...
  • 2.常见的http错误描述原因错误的是?D 原因分析: 403权限不够;(个人意见,这道题实际上来说没有正确答案) 各种HTTP状态码链接 3.linux tcpdump监听网卡 eth0,对方主机IP为10.1.1.180,tcp端口为80的数据,...
  • 《Windows Sockets网络编程》是WindowsSockets网络编程领域公认...C.4 详细的错误描述 C.5 按数值排序的错误代码表 附录D 用户必备 D.1 重要文件 D.2 编译与链接机制 D.3 各种WinSock使用 D.4 各种编程语言使用
  • 强大扫描工具x-scan

    2009-11-13 23:17:02
    “跳过没有检测到开放端口主机” - 若在用户指定的TCP端口范围内没有发现开放端口,将跳 过对该主机后续检测。 “使用NMAP判断远程操作系统” - X-Scan使用SNMP、NETBIOS和NMAP综合判断远程操作系统类型 ,...
  • X-Scan v3.1

    2018-10-22 08:43:03
    “跳过没有检测到开放端口主机” - 若在用户指定的TCP端口范围内没有发现开放端口,将跳过对该主机后续检测。 “无条件扫描” - 如标题所述 “端口相关设置”页: “待检测端口” - 输入以“-”和“,”分隔...
  • 《Windows Sockets网络编程》是WindowsSockets网络编程领域公认...C.4 详细的错误描述 C.5 按数值排序的错误代码表 附录D 用户必备 D.1 重要文件 D.2 编译与链接机制 D.3 各种WinSock使用 D.4 各种编程语言使用
  • x-scan-v3.3-cn

    2013-09-23 21:36:56
    SuperScan 强大的TCP端口扫描器、Ping和域名解析器! Hscan 这是款运行在WinNT/2000下漏洞扫描工具,有GUI以及命令行两种扫描方式! WIN2K自动攻击探测机 WinNT/2000自动攻击探测机。 4899空口令探测 能够快速...
  • X-Scan

    热门讨论 2008-04-04 15:19:43
    “跳过没有检测到开放端口主机” - 若在用户指定的TCP端口范围内没有发现开放端口,将跳过对该主机后续检测。 “无条件扫描” - 如标题所述 <br> “端口相关设置”页: “待检测端口” - 输入以...
  • 1.1.8 NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的 1.1.9 输入 ping IP 后敲回车,发包前会发生什么?...
  • x-SCAN -V3.3-CN.

    2010-01-16 16:11:23
    “跳过没有检测到开放端口主机” - 若在用户指定的TCP端口范围内没有发现开放端口,将跳过对该主机后续检测。 “使用NMAP判断远程操作系统” - X-Scan使用SNMP、NETBIOS和NMAP综合判断远程操作系统类型,若...
  • x-scan3.3扫描工具

    2009-05-10 08:35:14
    “跳过没有检测到开放端口主机” - 若在用户指定的TCP端口范围内没有发现开放端口,将跳过对该主机后续检测。 “使用NMAP判断远程操作系统” - X-Scan使用SNMP、NETBIOS和NMAP综合判断远程操作系统类型,若...
  • WINDOWS网络编程技术

    2008-06-12 20:19:58
    15.7 常见错误 416 15.8 Windows CEWinsock控件 417 15.8.1 Windows CE Winsock示例 417 15.8.2 已知问题 421 15.9 小结 422 第三部分 远程访问服务 第16章 RAS客户机 423 16.1 编译和链接 424 16.2 数据结构和...
  • Windows网络编程技术

    2010-08-23 10:11:30
    15.7 常见错误 416 15.8 Windows CEWinsock控件 417 15.8.1 Windows CE Winsock示例 417 15.8.2 已知问题 421 15.9 小结 422 第三部分 远程访问服务 第16章 RAS客户机 423 16.1 编译和链接 424 16.2 数据结构和...
  • 解决常见的引导问题 281 5.3 停机 286 5.4 本章总结 288 第6章 进程、线程和作业 289 6.1 进程内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关函数 298 6.2 CreateProcess流程 300 阶段1:打开...
  • 解决常见的引导问题 281 5.3 停机 286 5.4 本章总结 288 第6章 进程、线程和作业 289 6.1 进程内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关函数 298 6.2 CreateProcess流程 300 阶段1:打开...
  • 在多个设备/模拟器连接的情况下较常用的是 -s <serialNumber> 参数,serialNumber 可以通过 adb devices 命令获取。如: $ adb devices List of devices attached cf264b8f device emulator-5554 device 10....
  • 一卡通软件

    2015-03-11 16:15:22
    串口通讯 通讯端口选择好电脑用于通讯串口号码 通讯波特率固定为有线19200,无线38400 串口连接注意 设置不正确通讯端口在通讯时可能导致系统无法正常通讯及采集数据 TCP/IP通讯 输入TCP/IP-RS485转换器IP...
  • FAQ(持续更新)

    2021-01-08 12:27:51
    错误的方法是在process里直接sleep。正确做法,向server所在的series里添加一个timer任务。以http server为例: ~~~cpp void process(WFHttpTask <em>server_task) { WFTimerTask </em>timer = ...
  • 22.5 一些有用I/O端口 22.5.1 并行端口 22.5.2 游戏端口 22.5.3 串行端口 第五部分 Linux系统安全分析 第二十三章 系统管理员安全 23.1 安装管理 23.2 超级用户 23.3 文件系统安全 23.3.1 Linux文件系统概述 ...
  • 16.2 TCP/IP网络分层 137 16.3 BSD 套接口 138 16.4 INET套接口层 140 16.4.1 创建BSD 套接口 141 16.4.2 给INET BSD 套接口指定地址 141 16.4.3 在INET BSD套接口上创建连接 142 16.4.4 监听INET BSD 套接口 142 ...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

常见tcp端口描述错误的是