C++ send(),linux套接字通过本地主机使我的程序/服务器崩溃

C++ send(),linux套接字通过本地主机使我的程序/服务器崩溃,c++,linux,sockets,network-programming,localhost,C++,Linux,Sockets,Network Programming,Localhost,我已经编写了一个相对简单的服务器应用程序,它处理GET请求,并通过internet将静态页面从桌面计算机提供给web浏览器 它在internet上运行良好,但当我在localhost上测试时,我发现它在特定情况下崩溃 在一个新的连接上,它经常会崩溃,但前提是它以前已经连接过 换句话说,如果我在浏览器中打开localhost,它将按预期提供索引页 如果我在浏览器搜索栏中再次单击return(返回)并在localhost中加载,它将崩溃,这是一个很高的百分比,但当我通过端口80在internet上服

我已经编写了一个相对简单的服务器应用程序,它处理GET请求,并通过internet将静态页面从桌面计算机提供给web浏览器

它在internet上运行良好,但当我在localhost上测试时,我发现它在特定情况下崩溃

在一个新的连接上,它经常会崩溃,但前提是它以前已经连接过

换句话说,如果我在浏览器中打开localhost,它将按预期提供索引页

如果我在浏览器搜索栏中再次单击return(返回)并在localhost中加载,它将崩溃,这是一个很高的百分比,但当我通过端口80在internet上服务器页面时,这种情况永远不会发生

索引页面本身在其他页面中动态加载,一些通过html标记(如和)加载,另一些通过$().load使用XMLHttpRequest加载

我想知道请求在本地主机和端口80上的路由方式是否有什么特别的区别,这可以解释这个问题吗

否则,我的代码相当复杂,但崩溃发生在实际调用:

ssize_t bytesSent = send(fd, message, size, 0);
我已经做了很多测试,以确保fd正常,并且大小和消息的更改不会导致崩溃,并且我找不到任何问题。例如,如果文件大小不正确,它不会使服务器崩溃,只需给出意外的行为,我仔细检查了fd是如何生成的,它没有在那里出错

调用周围的代码如下所示:

int TcpSocket::doSend(const char* message, int fd, size_t size) const
{
    if (fd == 0)
    {
        fd = mFiledes;
    }

    size = (size == 0) ? strlen(message) : size;
    ssize_t bytesSent = send(fd, message, size, 0);

    if (bytesSent < 1)
    {
        return -1;
    }

    return 0;
}

您的程序中是否使用多个线程?如果是,可能是您没有正确锁定资源,导致一个线程读取内存位置,而另一个线程写入该位置?是的,我正在运行多线程,但这也是我的第一个怀疑,因此我只使用一个活动线程运行服务器,唉,仍然存在相同的问题…send()崩溃的可能性很小,除非你破坏了一些记忆。所以,用valgrind运行你的程序,看看它是否检测到任何东西。或者,当程序崩溃时,您可以在gdb中运行程序(或获取coredump),然后打印stacktrace?它在哪个
doSend
上崩溃?第一个还是第二个?@SamRedway默认情况下,如果尝试写入已断开的TCP连接,您将获得一个SIGPIPE。这几乎总是一个不好的默认值,因此在TCP应用程序中忽略SIGPIPE(使用signal()或sigaction())是常见的做法,而是处理send()返回的错误代码。您的程序中是否使用多个线程?如果是,可能是您没有正确锁定资源,导致一个线程读取内存位置,而另一个线程写入该位置?是的,我正在运行多线程,但这也是我的第一个怀疑,因此我只使用一个活动线程运行服务器,唉,仍然存在相同的问题…send()崩溃的可能性很小,除非你破坏了一些记忆。所以,用valgrind运行你的程序,看看它是否检测到任何东西。或者,当程序崩溃时,您可以在gdb中运行程序(或获取coredump),然后打印stacktrace?它在哪个
doSend
上崩溃?第一个还是第二个?@SamRedway默认情况下,如果尝试写入已断开的TCP连接,您将获得一个SIGPIPE。这几乎总是一个不好的默认值,因此在TCP应用程序中忽略SIGPIPE(使用signal()或sigaction())是常见的做法,而是处理send()返回的错误代码。
(gdb) run
Starting program: /home/sam/sserv/bin/sserv 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffef7fe700 (LWP 2169)]
[New Thread 0x7fffeffff700 (LWP 2168)]
[New Thread 0x7ffff4fbf700 (LWP 2167)]
[New Thread 0x7ffff57c0700 (LWP 2166)]
[New Thread 0x7ffff5fc1700 (LWP 2165)]
[New Thread 0x7ffff67c2700 (LWP 2164)]
[New Thread 0x7ffff6fc3700 (LWP 2163)]

Program received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7ffff5fc1700 (LWP 2165)]
0x00007ffff76a62ef in __libc_send (fd=5, buf=0x7fffe8003700, n=2219, flags=0)
    at ../sysdeps/unix/sysv/linux/x86_64/send.c:31
31  ../sysdeps/unix/sysv/linux/x86_64/send.c: No such file or directory.