【发布时间】:2014-07-02 15:03:44
【问题描述】:
背景:
我有下面的 C++ 代码监听端口26009 上的 UDP 数据包,然后输出接收到的数据包
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
udpSocket.bind(26009); //the port that GUI listens (26009)
connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void MainWindow::readyRead(){
QByteArray datagram;
do {
datagram.resize(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(datagram.data(), datagram.size());
} while (udpSocket.hasPendingDatagrams());
qDebug() << "Message: " << datagram;
}
在客户端,这里是unicast 20 udp packet: hi0, hi1, ... hi19 的 C 代码:
int main(void){
int i;
char msg[5] = {'\0'};
for(i=0; i<20; i++){
snprintf(msg, 4, "hi%d", i);
send_unicast("192.168.5.1", msg, 26009);
memset(msg, 0, sizeof msg);
}
return 0;
}
void send_unicast(char IPaddr[16], char* message, uint16_t destPort){
struct sockaddr_in si_other;
int s, slen = sizeof(si_other);
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
fprintf(stderr, "socket() failed - line817\n");
exit(1);
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(destPort);
if (inet_aton(IPaddr, &si_other.sin_addr) == 0) {
fprintf(stderr, "inet_aton() failed - line 825\n");
exit(1);
}
if (sendto(s, message, 512, 0, (struct sockaddr *) &si_other, slen) == -1){
fprintf(stderr, "sendto() failed - line830\n");
exit(1);
}
close(s);
}
我在不同的 Linux 设备上运行 C++(服务器)和 C(客户端)代码。
问题:
C 代码可以正常工作并生成数据包。我可以在 Wireshark 上看到数据包是在接收端(C++)收到的。
但是,上面的 C++ 代码无法正确接收(或处理)数据包,代码处理速度太快了,我只看到几个输出,例如
hi5
hi14
如果 C 代码的传输频率显着减慢(添加 sleep(1)),则 C++ 代码可以正常输出数据包。
问题:
我使用接收到的 UDP 数据包来更新 GUI (Qt) 上的一些信息。我猜slot 会导致速度变慢,如果我使用pthread 来监听数据包,那么代码会处理流量,但是线程需要如何通知主类以便 GUI 可以相应地更新?
总而言之,您建议如何修改 C++ 代码,使其能够处理快速数据流量并通知 GUI 更新?
【问题讨论】:
标签: c++ c qt sockets networking