[Çözüldü]Qt nextPendingConnection() Nedeni İle Segmentation Fault

Başlatan hrgn, 29 Temmuz 2010 - 16:23:55

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

hrgn

Merhaba herkese.
Sorunuma daha uygun bir başlık bulamadım.Biraz uzun oldu neyse soruna geçelim.Qt apilerinden yararlanarak tcp server kodlayayım dedim(tek nedeni merak).Ancak segmentation fault ile karşılaştım.Buyrun server.cpp


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTcpServer *tcpserver;
    QTcpSocket *tcpsocket;
    QDataStream dt(tcpsocket);
    tcpserver = new QTcpServer(this);
    tcpserver->listen(QHostAddress::Any,2222);
    if(!tcpserver->isListening())
        QMessageBox::warning(this,"Hata!","Bağlantı Sağlanamadı.",0,1);
    tcpsocket=tcpserver->nextPendingConnection(); //Sorun sanırım burda
    dt.setVersion(QDataStream::Qt_4_5);
    if(tcpsocket->bytesAvailable()>0);
    {
        QString msg;
        dt >> msg;
        ui->label->setText(msg);
    }


Qt designer ile mainwindow'a bir adet içi boş label yerleştirdim.Başka da bişi yok.Örnek kodlarda da kullanılan bu sorunlu satır bende hataya yol açtı.Yardımlarınız için şimdiden teşekürler.Kolay gelsin.

mce

nextPendingConnection() null döndürüyor olabilir, o yüzden
if(tcpserver->hasPendingConnections()) {
     tcpsocket=tcpserver->nextPendingConnection();
}


işe yarayabilir.

hrgn

@mce sorun devam ediyor.Ancak bu kontrolü kullanmak genel anlamda iyi olacaktır.Teşekür ederim.Fikri olan var mı sorun nasıl çözülür.

mce


sem

Merhabalar, QT ile ilgili bir bilgim yok fakat fikir verebilmek adına şunları diyeyim ben de...

*tcpserver,  *tcpsocket gibi göstericiler tanımlamışsınız. Bu göstericilere değer atarken kullandığınız fonksiyonlar güvenli bellek ayırmıyorlarsa ise bu hatayı alırsınız.

#include <stdio.h>

int main()
{
   int *  sem;
   *sem = 5;
}


Bu programı çalıştırırsanız aynı hatayı alırsınız çünkü sem göstericisi için ayrılan belleğin bir garantisi yoktur. Sistemin kullandığı bir adres bölgesini de temsil ediyor olabilir. Göstericeleri doğru kullandığınızdan emin olun derim.

İkinci olarak şüphe duyduğunuz yerlere printf ile işaret koyarsanız eğer sorunun nereden kaynaklandığını daha rahat anlarsınız...


#include <stdio.h>

int main()
{
   int *  sem;
   printf("Buraya kadar sorun yok\n");
   *sem = 5;
}


Küçük kodlu uygulamalarda işinize yarayacaktır... Kolay gelsin...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

hrgn

@sem0900 verdiğin bilgi için teşekürler.Seninde önerdiğin taktik ile hataları çözüyorum genelde :).

@mce sanada teşekürler önerdiğin kontrol sorgusunu senin verdiğin şekilde yapmıştım başta sorun çözülmemişti.Dün gece yatmadan önce bir defa daha kontrol edeyim dedim.Projeyi açtığımda gereksiz bellek kullanmamak için bir düzenleme yaptım.Farkında olmadan bu düzenleme sorunumu da çözdü.


if(tcpserver->hasPendingConnections())
    {
        tcpsocket=tcpserver->nextPendingConnection();
        dt.setVersion(QDataStream::Qt_4_5);
        if(tcpsocket->bytesAvailable()>0);
        {
            QString msg;
            dt >> msg;
            ui->label->setText(msg);
        }
    }


sanırım sorun QDataStream değişkeni olan dt nin yerini garanti etmememmiş.Ben öyle yorumladım.Yardımlarınız için teşekürler.