2011-11-12 67 views
1

我剛剛在遊戲中出現了一些小故障,如果服務器在客戶端之前啓動,但是當客戶端在服務器之前啓動並且它們從不連接時,一切運行正常。這是所有UDPUDP:客戶端在服務器之前啓動

當客戶端在服務器啓動之前嘗試調用recvfrom()時發生問題,此時客戶端永遠找不到服務器,服務器也找不到客戶端。結果錯誤是一個willblock。

如果我停止客戶端使用recvfrom並在服務器之前啓動客戶端(客戶端仍在發送數據,它只是沒有收到它),他們都發現對方沒有問題。

這是什麼解決方案?它現在看起來就是,客戶端不能在沒有服務器處於活動狀態的情況下調用recvfrom,否則這一切都會崩潰。是否有可以檢查數據是否位於某個端口(服務器將發送的數據)的檢查?還是有更好的方法來做到這一點?

一些代碼...

服務器操作 - UDPSocket是一類

UDPSocket.Initialise(); 
    UDPSocket.MakeNonBlocking(); 
    UDPSocket.Bind(LOCALPORT); 
    int n = UDPSocket.Receive(&thePacket); 
    if (n > 0) 
    UDPSocket.Send(&sendPacket); 

客戶端...

UDP.Initialise(); 
    UDP.MakeNonBlocking(); 
    UDP.SetDestinationAddress(SERVERIP, SERVERPORT); 

    serverStatus = UDP.Receive(&recvPacket);  
    if (serverStatus > 0) 
    { 
     //Do some things 
     UDP.Send(dPacket); //Try and reconnect with server 
    } 

感謝

回答

2

EWOULDBLOCK是不是一個錯誤本身 - 這意味着套接字是非阻塞的,並且沒有數據要讀取。我認爲你的服務器監聽數據並通過UDP回覆,並且客戶端在啓動並收到回覆時發送一個數據包?如果是這樣,無論如何你可能會遇到競爭狀態 - 如果服務器正在運行,但是速度有點慢,那麼你的客戶端會收到EWOULDBLOCK?你的客戶會退出嗎?也許你想在客戶端進行阻止接收,或者更好的方法是使用select()WaitForMultipleEvents()或TCP或其他。

+0

客戶端和服務器不斷髮送數據到某個端口(客戶端剛剛連接到本地IP),如前所述,這隻有在客戶端在服務器之前打開時纔會中斷。我不明白爲什麼會導致服務器或客戶端沒有收到任何數據 – Chris

+0

某些僞代碼或最小的實際「破碎」代碼在這裏會有所幫助。您的兩個程序如何交互還不完全清楚。 –

+0

添加網絡代碼希望它有意義 – Chris