2013-05-12 35 views
6

POCO C++ kitaplıklarına sahip bir TCP Sunucusu geliştirmeye çalışıyorum. Bazı örnekler buldum here. İlk başta Alex den örnek aldım ama kapatma olayı işe yaramadı. EchoServer aynı soruna sahip. Öyleyse, o zaman Cesar Ortiz örneğini denedim ve sıra dışı bir problem yaşadım. Bir süre sunucusu bir hata atar sonra:POCO C++ kitaplıkları ile Çoklu Yazılı TCP Sunucusu

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
["src/ErrorHandler.cpp", line 60] 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

Ve bağlantıları da bağlantı zaman aşımı hatası, yeni bağlantılar var. Örnek olay olayına örnek verilmiş daha doğru, ancak kapatma olayını nasıl düzeltebilirim bilmiyorum.

cevap

12

İstediğiniz tek şey çok iş parçacıklı bir TCP sunucusudur, daha sonra "kutunun dışında" Poco::Net::TCPServer yapacak - dahili olarak çok iş parçacıklı. Sonra

class EchoConnection: public TCPServerConnection { 
public: 
    EchoConnection(const StreamSocket& s): TCPServerConnection(s) { } 

    void run() { 
    StreamSocket& ss = socket(); 
    try { 
     char buffer[256]; 
     int n = ss.receiveBytes(buffer, sizeof(buffer)); 
     while (n > 0) { 
     ss.sendBytes(buffer, n); 
     n = ss.receiveBytes(buffer, sizeof(buffer)); 
     } 
    } 
    catch (Poco::Exception& exc) 
    { std::cerr << "EchoConnection: " << exc.displayText() << std::endl; } 
    } 
}; 

sunucusu çalıştırmak ve ona bazı veri göndermek: Cevap Alex için

TCPServer srv(new TCPServerConnectionFactoryImpl<EchoConnection>()); 
srv.start(); 

SocketAddress sa("localhost", srv.socket().address().port()); 
StreamSocket ss(sa); 
std::string data("hello, world"); 
ss.sendBytes(data.data(), (int) data.size()); 
char buffer[256] = {0}; 
int n = ss.receiveBytes(buffer, sizeof(buffer)); 
std::cout << std::string(buffer, n) << std::endl; 

srv.stop(); 
+0

Teşekkür bağlantıyı tanımlayan başlayın , bu sadece buna göndermek ne olursa olsun geri yankılanacak. Dediğim gibi, şimdi sizinki gibi ikinci örneği kullanıyorum, ancak 'src/errorhandler.cpp' mesajıyla bir hatanın sebebini bulamıyorum. Bu sunucu bağlantıları kabul ettikten sonra yeni bağlantılar için bayt gönderip almaz ve mevcut bağlantılar için 'bağlantı zaman aşımı' atar. –

+0

Bağlantı işleyicinizde bir yere bir istisna atmalısınız. Bir iş parçacığı içinde çalıştığı için, varsayılan hata işleyicisinde biter. İstisna muhtemelen std :: exception'dan bir soydaş değildir, bu yüzden ErrorHandler bu konuda hiçbir şey bilmiyor. Ama sorunun ne olduğuna dair kesin bir cevap için yeterli bilgi vermiyorsunuz. Kodunuzu hata ayıklayıcısında çalıştırmak ve sorunun kaynağının nerede olduğunu bulmak için adım adım ilerleyin. – Alex

+0

Dediğim gibi, Cesar Ortiz örneğini kullanıyorum, sadece 'run' işlevini değiştirdim - [burada] (http://hastebin.com/lokadobeve.coffee) Bir bağlantı veri alınamadığında çünkü kuyrukta, ama nedenini anlayamıyorum? Mevcut bağlantılar 16'ya ulaştığında, tüm yeni bağlantılar sıraya eklenir ve sonra reddedilir. Parazitlerde max. (3), maxthreads (20) ve threadidletime (100) –