日期:2014-05-16  浏览次数:20671 次

这是一个非常疯狂的探究
在Linux下,有没有谁试过用服务端接受客户端的接入之后,用接入所返回的fd值去向服务端的监听套接字发消息?这是一个比较神奇的实验。执行之后服务器会马上core dump,而且捕捉不到异常,有人能给个答案吗?测试代码如下:

C/C++ code

//============================================================================
// Name        : send_to_self.cpp
// Author      : AngryPowman
// Version     :
// Copyright   : *
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>

using namespace std;

#define SOCKET_ERROR -1
const int MAX_LEN = 4096;

int main()
{

    try
    {
        int listen_fd_ = socket(AF_INET, SOCK_STREAM, 0);
        if (listen_fd_ == SOCKET_ERROR)
        {
            cout << "Create socket error." << endl;
            return false;
        }

        int val = 1;
        if (0 != setsockopt(listen_fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)))
        {
            cout << "setsocket error." << endl;
        }

        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        addr.sin_port = htons(12345);

        int bind_err = bind(listen_fd_, (const sockaddr*)&addr, sizeof(addr));
        if (bind_err == SOCKET_ERROR)
        {
            cout << "bind failed." << endl;
            return false;
        }

        int listen_err = listen(listen_fd_, SOMAXCONN);
        if (listen_err == SOCKET_ERROR)
        {
            cout << "listen failed." << endl;
            return false;
        }

        while (true)
        {
            int fd_client_new = 0;
            sockaddr_in addr_client;

            unsigned int len = sizeof(addr_client);
            fd_client_new = accept(listen_fd_, (sockaddr*)&addr_client, &len);

            if (fd_client_new == SOCKET_ERROR)
            {
                cout << "accept failed." << endl;
            }
            else
            {
                cout << "accept : " << inet_ntoa(addr_client.sin_addr) << endl;
                //cout << "accept client:" <<

                //向监听套接字发送消息
                cout << "send" << endl;
                int fd_sd = send(listen_fd_, "12345", strlen("12345"), 0);
                cout << "test" << endl;
                cout << fd_sd << endl;

            }
        }

    }
    catch (...)
    {
        cout << "exception." << endl;
    }

    sleep(10000);

    return 0;
}




在执行send之后,程序就无故退出了,后面的两个cout都没正常输出,也catch不了异常。ulimit -c unlimited也没产生dump日志,后来试了echo #?倒是发现返回了141,我想可能是send里面用了 exit(141) 这样的方式去结束了程序,但这个141到底是什么意思?

------解决方案--------------------
一般不都是fork之后再执行网络操作的吗?这样core dump就dump了,客户端进不来就是了。

------解决方案--------------------
自己向自己发消息,应该不会崩溃啊
------解决方案--------------------
好高深啊, 顶哦..
------解决方案--------------------
没弄过Linux
------解决方案--------------------
不懂 呵呵
------解决方案--------------------
这并不是一个有效的TCP连接啊