linux - C++ Socket Connection automatically establishing? -
i programming c++ module creates socket server thread, polls accept() function every 1ms. have test module spoofs client connection running. test module initiates creation of server thread. after thread created , verified running, client runs connect() command test. code states connection established, returning 0 on connect command. however, accept() running in server thread never receives connection.
the server bound accepting ip:50000, , client not bound, has 127.0.0.1:50000 set destination. linux environment automatically accepting connection?
here code server's socket:
int nsocket; int non = 1; int ncontrol; struct sockaddr_in sserveraddress; nsocket = socket(pf_inet, sock_stream, ipproto_tcp); if(nsocket < 0) { std::cout << "failed create socket\n"; } if(setsockopt(nsocket, sol_socket, so_reuseaddr, &non, sizeof(int)) < 0) { std::cout << "failed set socket option\n"; } ncontrol = fcntl(nsocket, f_getfl); if(fcntl(nsocket, f_setfl, o_nonblock | ncontrol) < 0) { std::cout << "set not blocking failed\n"; } memset(&sserveraddress, 0x00, sizeof(struct sockaddr_in)); sserveraddress.sin_family = af_inet; sserveraddress.sin_addr.s_addr = htonl(inaddr_any); sserveraddress.sin_port = htons(mtlistenport); if(bind(nsocket, (struct sockaddr*)&sserveraddress, sizeof(struct sockaddr_in)) < 0) { std::cout << errno << "bind failed\n"; } if(listen(nsocket, maxpending) < 0) { std::cout << "listen failed\n"; }
here code test client's socket:
int nsocket; nsocket = socket(pf_inet, sock_stream, ipproto_tcp); if(nsocket < 0) { std::cout << "failed create socket\n"; } struct sockaddr_in serveraddress; serveraddress.sin_family = af_inet; inet_aton(local_host, &serveraddress.sin_addr); serveraddress.sin_port = htons(listen_port00); char msg[] = "hello world."; usleep(10000); if (connect(nsocket, (struct sockaddr *) &serveraddress, sizeof(serveraddress)) < 0) { std::cout << errno << "could not connect server.\n"; } usleep(10000); if (sendto(nsocket, msg, strlen(msg), 0, (struct sockaddr *) &serveraddress, sizeof(serveraddress)) < 0) { std::cout << errno << "could not send data server.\n"; }
here small part of thread runs accept code.
while(mblistening) { nmessengersocket = accept(mnsocket, (struct sockaddr*)&sclientaddr, &tclientaddrlength); if(nmessengersocket >= 0) { std::cout << "accepted connection " << inet_ntoa(sclientaddr.sin_addr) << std::endl; mnconnections++; mblistening = false; } mthreadrunningtime++; usleep(1000); }
make sure tclientaddrlength
initialized sizeof sclientaddr
before calling accept()
. common error.
don't silently ignore errors. examine error code in errno
because tells went wrong.
Comments
Post a Comment