2012-10-04 62 views
0

我正在調試我的應用程序(排序的後續an earlier question),這實質上是一個玩具點對點客戶端。它的工作原理如下:兩個同時發送鎖定這兩個程序

  • 對等體從對等體2
  • 對等體2接收請求1個請求的塊(或多個塊),並將該塊後面

和循環或多或少重複。這對於較小的文件非常適用,但是任何文件必須分割成大量的塊(比如250個字節的512字節)纔會死掉。

運行在對等體2(即接收請求的那一個)strace的看起來像這樣:

....  
[pid 11731] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f03d0ac9000 
[pid 11731] lseek(400, 200704, SEEK_SET) = 200704 
[pid 11731] read(400, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024 
[pid 11731] read(400, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 11731] sendto(5, "SF\0\0\1\212\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 522, 0, NULL, 0) = 522 
[pid 11731] select(6, [4 5], NULL, NULL, NULL) = 1 (in [5]) 
[pid 11731] recvfrom(5, "BB\0\0\0\t\0\0\1\213\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, NULL) = 300 
[pid 11731] open("test.dat", O_RDONLY) = 401 
[pid 11731] fstat(401, {st_dev=makedev(8, 4), st_ino=9187328, st_mode=S_IFREG|0644, st_nlink=1, st_uid=1000, st_gid=1000, st_blksize=4096, st_blocks=20480, st_size=10485760, st_atime=2012/10/03-10:25:29, st_mtime=2012/10/03-10:25:34, st_ctime=2012/10/03-10:25:34}) = 0 
[pid 11731] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f03d0ac8000 
[pid 11731] lseek(401, 200704, SEEK_SET) = 200704 
[pid 11731] read(401, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1536) = 1536 
[pid 11731] read(401, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 11731] sendto(5, "SF\0\0\1\213\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 522, 0, NULL, 

而strace的對等體1(即發送請求的那一個)的結果看起來像這樣:

.... 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\213\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\214\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\215\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\216\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\217\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\220\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\221\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0 

兩者都在發送時死亡。我不完全確定爲什麼。如果任何人都可以對此有所瞭解,我會非常感激!

+1

Die?塊?這是什麼? – EJP

回答

0

您的發送被阻止,因爲對方沒有讀取它們。這會導致對等體的接收緩衝區被填充,導致發送方的發送緩衝區被填充,導致send()阻塞。

+0

這是有道理的...有一個簡單的方法來沖洗發送緩衝區,或者我最好只是重建的東西? –

+0

@the_man_slim你最好閱讀對方發送給你的內容,或者根本不發送它,如果你不打算閱讀它,甚至完全不請求它。所有這些痕跡中只有一個'recvrom()'。應該和sendto()有相同的數字。 – EJP