2012-11-12 37 views
0

我們有一個應用程序,通過TCP套接字發送數據。我們爲此使用8個TCP連接。套接字發送和接收在後臺線程中調用。只有一個線程遍歷套接字數組來發送數據(順序)。線程中TCP套接字的奇怪行爲

在發送線程的代碼是一樣的東西:

for(i = 0; i < 8; i++) { 

    nBytesWrriten = send (tcpsock[i], data2, nleft, 0)) 
    //error handling and process more data 

} 

和接收線程是這樣的:

for(i = 0; i < 8; i++) { 

    sz[i] = recv (tcpsock[i], data, MAX_UDT_SIZE, 0); 
    //process data 
} 

一切工作正常,得到的數據傳輸,但有時它只是時間太長。 在檢查日誌時,我發現在大多數情況下,發送者線程工作得很好,但有時候,'發送'呼叫之前和之後在時間戳(有時超過一秒)方面存在巨大延遲。

所有發送和接收操作都發生在工作線程中。在發送呼叫之前/在發送呼叫之前是否需要搶佔線程?我可以在發送呼叫之前避免搶佔線程嗎?還是說接收線程在發送準備好更多的數據時沒有收到套接字上的數據,因此會導致延遲?

如何優化它,因爲發送數據花費的時間太長?

謝謝

+0

您可以使用像[Wireshark](http://www.wireshark.org/)這樣的工具來檢查是否有任何延遲低於您的應用程序。 – Default

+0

你的套接字是否阻塞('O_NONBLOCK')?如果不是,直到所有的數據已被本地TCP堆棧接受(這隻與線路上的內容有關,可能是立即的或可能需要一些時間),send()調用纔會返回。包括wireshark/tcpdump跟蹤可能會有所幫助。 –

回答

1

您應該使用非阻塞套接字發送。可能發生的事情是,一個(或多個)不能立即發送,所以它會等待,直到它可以發送一些數據,也許緩衝區滿或任何。

使用非阻塞套接字不會停止,但您必須檢查數據是否未發送到某些套接字並稍後再試。

+0

但他說,插座是在後臺線程 – Default

+0

@默認,他說發送延遲(塊),只有一個線程。 – aaronps

0

在發送之前在每個套接字上執行select以查看是否可以不阻塞地寫入,否則您將阻止其他套接字上的發送。你會想在讀取方面做同樣的事情,或者缺乏可讀性可能會阻止可用的讀取。

+2

從設計的角度來看,你應該做的是在所有的套接字上同時做兩個「選擇」,並且在循環中寫入並讀取每一個準備好的數據。如果所有套接字都沒有準備好,這將阻止旋轉輪詢... – mark