Good day. I am writing a normal chat.

void server::start(){ int MasterSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in SockAddr; SockAddr.sin_family = AF_INET; SockAddr.sin_port = htons(_port_number); SockAddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(MasterSocket, (struct sockaddr*)(&SockAddr), sizeof(SockAddr)); set_nonblock(MasterSocket); listen(MasterSocket, SOMAXCONN); int EPoll = epoll_create1(0); struct epoll_event Event; Event.data.fd = MasterSocket; Event.events = EPOLLIN; epoll_ctl(EPoll, EPOLL_CTL_ADD, MasterSocket, &Event); unique_lock<mutex> buffer_lock(m_buffer, defer_lock); thread t(&server::algo_start, this); t.detach(); while(true){ struct epoll_event Events[_max_events]; int N = epoll_wait(EPoll, Events, _max_events, -1); for(int i = 0; i < N; i++){ if(Events[i].data.fd == MasterSocket){ sockaddr_in client_addr; int client_addr_size = sizeof(client_addr); int SlaveSocket = accept(MasterSocket, (struct sockaddr*)(&client_addr), (socklen_t*)client_addr_size); //int SlaveSocket = accept(MasterSocket, 0, 0); set_nonblock(SlaveSocket); SlaveSockets.insert(SlaveSocket); struct epoll_event Event; Event.data.fd = SlaveSocket; Event.events = EPOLLIN; epoll_ctl(EPoll, EPOLL_CTL_ADD, SlaveSocket, &Event); cout << "New client connect..." << endl; } else{ char buffer[1024]; int RecvSize = recv(Events[i].data.fd, buffer, 1024, MSG_NOSIGNAL); if(RecvSize == 0 && errno != EAGAIN){ shutdown(Events[i].data.fd, SHUT_RDWR); SlaveSockets.erase(Events[i].data.fd); epoll_ctl(EPoll, EPOLL_CTL_DEL, Events[i].data.fd, (epoll_event*)EPOLLIN); cout << "Client disconnect..." << endl; } if(RecvSize > 0){ for(auto it = SlaveSockets.begin(); it != SlaveSockets.end(); it++) if(*it != Events[i].data.fd) send(*it, buffer, RecvSize, MSG_NOSIGNAL); buffer_lock.lock(); message_buffer.push(message_info(RecvSize, buffer, 0)); buffer_lock.unlock(); } } } } } 

Problem in defining SlaveSocket. When I call accept (Master, 0, 0) - everything is fine. If I call accept (Master, sockaddr, socklen), then my client connects and disconnects immediately (connection closed by foreign host). Why is that???

    1 answer 1

    the data type client_addr_size needed to be changed to socklen_t