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