Unsolved QTCPSocket bind and listen forever for incomming data from a specific port
-
Hello,
I am trying to make a QTCPConnection from a port1234
for example. My interface is as simple as this:s->tcp = new QTcpSocket(s); connect(s->tcp, SIGNAL(connected()), s, SLOT(tcpConnected())); connect(s->tcp, SIGNAL(disconnected()), s, SLOT(tcpDisconnected())); connect(s->tcp, SIGNAL(readyRead()), s, SLOT(readyReadTcp())); s->tcp->bind(QHostAddress::Any, 1234);
The behaviour I expect is that to the UDP bind. But I don't want to know the address of the sender. So is that possible, or some kind of a handshake must be done before? I just want to stick to
1234
port and collect it's data via TCP. -
Hi,
What do you mean by
I don't want to know the address of the sender
? -
@SGaist
Hello, sorry for the late reply. Here is what I am trying to achieve with Qt socket API:Server* s = &Server::Instance(); p_server = s; uint8_t* buffer = nullptr; udp_data_t frame = {0, {0}, {{0}}}; int client, newsocketfd; size_t len; struct sockaddr_in serv_addr, client_addr; if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Error opening socket!"); exit(1); } memset((char*)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(1234); if (bind(socket_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { perror("BIND failed"); exit(1); } listen(socket_fd, 5); client = sizeof(client_addr); static char msg[128] = {0}; for(;;) { newsocketfd = accept(socket_fd, (struct sockaddr*)&client_addr, (socklen_t*)&client); if (newsocketfd < 0) { perror("Error on accept"); exit(1); } for(;;) { for(buffer = (uint8_t*)&frame, len = 0; len < sizeof(frame);) { int nn = read(newsocketfd, buffer, sizeof(frame) - len); len += nn; buffer += nn; } printf("%lu\n", (long unsigned int) frame.counter); if (++s->m_conn_info.paketCounter != frame.counter) { s->m_conn_info.paketCounter = frame.counter; snprintf(msg, sizeof(msg), "Missed: %lu\n", (long unsigned int) s->m_conn_info.paketCounter+1); utils::IPC::Instance().sendMessage(msg); } else { QList<sample_data_t> ls; // copy all the data then send it to the plugins for(int i=0; i < 32; ++i) { sample_data_t pkt = {0, 0}; short smpls[16] ={0}; pkt.samples = smpls; pkt.size = 16; // fill the list to be passed to other plugins for(int j=0; j < 16; ++j) { pkt.samples[j] = frame.data[i][j]; } ls.append(pkt); } // finally send it s->put_data((QList<sample_data_t>*) &ls); } } close(newsocketfd); } close(socket_fd);
Don't mind the
Server
singleton, just see the C socket API.
Thanks. -
Shouldn't you rather be using QUdpSocket ?
-
@SGaist
Hello, unfortunate not, I have to support both UDP/TCP, I've done UDP but I am having troubles with the tcp. -
Can you describe how your application is supposed to operate ?
-
@SGaist
It's simple: collecting tcp/udp streams and organize them later ( pass them in the plugin tree ). Here is the playground for the udp/tcp streamer plugin:
https://github.com/heatblazer/recd2/tree/master/udp-streamer