首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

这是一个非常疯狂的探究,该如何解决

2012-04-28 
这是一个非常疯狂的探究在Linux下,有没有谁试过用服务端接受客户端的接入之后,用接入所返回的fd值去向服务

这是一个非常疯狂的探究
在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 -1const 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连接啊

热点排行