草庐IT

c - UNIX TCP/IP :read: Transport endpoint is not connected read: Transport endpoint is not connected

coder 2023-06-22 原文

我正在尝试使用以下程序来显示从端口 8888 收到的消息。 我编译了以下代码,没有任何错误和警告。

运行后,我用浏览器打开127.0.0.1:8888

然后,控制台显示:

read: Transport endpoint is not connected
read: Transport endpoint is not connected

我调试了,找不到原因。

平台

Linux 内核 3.x Ubuntu 64 位

代码

#include <stdio.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <netinet/in.h>
//#include <errno.h>

int main(int argc, char *argv[])
{
    int sock;
    char buf[BUFSIZ+1];

    buf[BUFSIZ] = '\0';
    uint16_t port = (uint16_t)atoi("8888");
    struct sockaddr_in ser;
    memset(&ser, 0, sizeof(ser));
    ser.sin_port = htons(port);
    ser.sin_addr.s_addr = htonl(INADDR_ANY);
    ser.sin_family = AF_INET;

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock < 0)
    {
        perror("socket");
        return -7;
    }

    /*Bind*/
    if (bind(sock, (struct sockaddr *)&ser, sizeof(ser)) < 0)
        return -2;

    /*listen*/
    if (listen(sock, 5) < 0)
        return -3;

    /*Accpet*/
    struct sockaddr_in cliAddr;
    socklen_t cliLen = sizeof(cliAddr);
    if (accept(sock, (struct sockaddr*)&cliAddr, &cliLen) < 0)
    {
        perror("accept");
        exit(1);
    }
    int read_len = 0;
    int i = 0;

    /*read and print*/
    while(1)
    {
        read_len = read(sock, buf, BUFSIZ);
        if(read_len < 0)
        {
            perror("read");
            break;
        }
        else
        {
            /*print buf*/
            while(i++ < read_len)
                putchar(buf[i-1]);
            putchar('\n');
        }
        if(read_len != BUFSIZ)
            break;
    }
    return 0;
}

如果您在我的代码中发现任何不良习惯,请告诉我。

最佳答案

您正在尝试读取错误的套接字。 accept() 返回一个新套接字,您应该从该新套接字读取数据并向其写入数据。

您的代码应该更像这样:

int readSocket = accept(sock ...);
if (readSocket == -1)
{
    // error
}
else
{
    // set up stuff and while loop
    read_len = read(readSocket....); // << Note which socket is being read

    // other stuff
}

关于c - UNIX TCP/IP :read: Transport endpoint is not connected read: Transport endpoint is not connected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044872/

有关c - UNIX TCP/IP :read: Transport endpoint is not connected read: Transport endpoint is not connected的更多相关文章

  1. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. ruby - File.read ("| echo mystring") 是如何工作的? - 2

    我在我正在处理的一些代码中发现了这一点。它旨在解决从磁盘读取key文件的要求。在生产环境中,key文件的内容位于环境变量中。旧代码:key=File.read('path/to/key.pem')新代码:key=File.read('|echo$KEY_VARIABLE')这是如何工作的? 最佳答案 来自IOdocs:Astringstartingwith“|”indicatesasubprocess.Theremainderofthestringfollowingthe“|”isinvokedasaprocesswithappro

  4. ruby - 如何通过 Rubocop 指示打开 & :read as argument to File. - 2

    我有这个代码File.open(file_name,'r'){|file|file.read}但是Rubocop发出警告:Offenses:Style/SymbolProc:Pass&:readasargumenttoopeninsteadofablock.你是怎么做到的? 最佳答案 我刚刚创建了一个名为“t.txt”的文件,其中包含“Hello,World\n”。我们可以按如下方式阅读。File.open('t.txt','r',&:read)#=>"Hello,World\n"顺便说一下,由于第二个参数的默认值是'r',所以这样

  5. ruby - Chef : Read variable from file and use it in one converge - 2

    我有以下代码,它下载一个文件,然后将文件的内容读入一个变量。使用该变量,它执行一个命令。这个配方不会收敛,因为/root/foo在编译阶段不存在。我可以通过多个聚合和一个来解决这个问题ifFile.exist但我想用一个收敛来完成它。关于如何做到这一点有什么想法吗?execute'download_joiner'docommand"awss3cps3://bucket/foo/root/foo"not_if{::File.exist?('/root/foo')}endpassword=::File.read('/root/foo').chompexecute'join_domain'd

  6. ruby-on-rails - Ruby method_added 回调不触发包括模块 - 2

    我想写一点“Deprecate-It”库并经常使用“method_added”回调。但是现在我注意到在包含模块时不会触发此回调。是否有任何回调或变通方法,以便在某些内容包含到自身时通知类“Foobar”?用于演示的小Demo:#IncludingModulswon'ttriggermethod_addedcallbackmoduleInvisibleMethoddefinvisible"Youwon'tgetacallbackfromme"endendclassFoobardefself.method_added(m)puts"InstanceMethod:'#{m}'addedto'

  7. Ruby:read_timeout 和 open_timeout 之间的区别 - 2

    标题本身就说明了......read_timeout和open_timeout之间有什么区别? 最佳答案 open_timeout是您愿意等待“打开连接”的时间。在TCP上下文中,在放弃尝试并引发超时错误之前等待握手完成的时间量。read_timeout您可能会猜到,是您愿意等待从连接方接收到某些数据的时间。一个例子可能会清楚地说明这一点:在SOAPoverHTTPoverTCP上下文中(简化):您尝试与服务器建立TCP连接。如果建立连接的时间比open_timeout长,则放弃连接尝试并引发/发出/返回超时错误。如果连接成功,您发

  8. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  9. ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies - 2

    我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种

  10. ruby - 异常 : why does adding parenthesis change anything? - 2

    关于Ruby如何处理内联错误处理程序,我想了解一些事情案例一这是一个常见的用例deffooraiseErrorendbar=foorescue1#=>1bar#=>1它按预期工作。表达式foorescue1返回1并正确分配给bar。案例二Ruby允许解构数组,所以这种行为看起来很奇怪。baz='a'baz,bar=foorescue[1,2]#=>[1,2]baz#=>'a'bar#=>nil表达式返回数组[1,2]但不解构或分配它。它完全跳过了分配。案例三但是,当您将错误括在括号中时,解构就起作用了。baz,bar=(foorescue[1,2])#=>[1,2]baz#=>1bar

随机推荐