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