2014-11-07 46 views
-1

原帖時,(1):accept()返回到標準輸出參考使用並行線程

我一直在學習,從Beej指南網絡編程學校網絡編程。我目前正在爲自己製作一個原型,通過使用線程和I/O多路複用同時在多個連接之間進行通信。我收到一個問題,當我收到一個連接並調用accept()返回一個新的文件描述符爲「new_fd」而不是返回一個新的文件描述符時,它返回1.這對我來說沒有意義,因爲我是不在我的代碼中的任何地方關閉標準輸出,並且accept()應該返回對套接字的引用作爲新的文件描述符,並且據我所知,線程在單個進程中共享相同的文件描述符,所以它不應該是個問題我有它的線程。我認爲這個問題可能是我使用環回從我自己的計算機連接,但是當我通過引用我的IP地址或另一臺計算機進行連接時,它也導致返回fd爲1的錯誤。我不知道在哪裏找了來解決這個問題

原帖代碼: http://pastebin.com/APQYjxg9 (我貼過我的所有代碼)

編輯本作清晰。我的代碼有兩個錯誤。第一個是由R指出..馬上和代碼片段是在這裏:

if (value = pthread_create((chat+chat_count), NULL, chatDaemon, (void *) &new_fd) != 0) 
{ -snip- } 

void * chatDaemon(void * fd) 
{ 
    int my_fd = *((int *)fd); 
    -snip- 
} 

我揣摩出了什麼問題,並張貼我的答案。代碼段,在這裏:

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) { -snip-} 

回答

2

經過很長時間後再次訪問。 R ..指出的缺乏同步會是一個問題,但它不會導致我遇到的問題。這是簡單地與接受邏輯小語法錯誤,所以我原本

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) 

其書面計算並返回上接受new_fd布爾檢查,這總是真正迴歸1的結果。我當時並沒有意識到c會按照這種方式排列這些操作,並且我用圓括號固定它。

if ((new_fd = accept(listen_fd, (struct sockaddr*) &remoteHost), &addrelen)) != -1) 
+0

呃,對不起,我沒有抓到這個。不過,「壁」本來可以抓住它。 – 2015-01-08 16:56:00

1

您的問題似乎是一個缺乏同步在chatDaemon閱讀*(int *)fd的。 fd是指向main中的局部變量new_fd的指針,可以在chatDaemon正在讀取它之前或在其調用chatDaemon時調用未定義的行爲。您需要爲int分配存儲空間來存儲fd並且讓chatDaemon免費,或者(優選)只需轉換成即可將其轉換爲void *,而不是試圖通過引用傳遞fd。

+0

我敢肯定的標準並不能保證的sizeof(無效*)> =的sizeof(int)的,這樣會太不確定 – Voo 2014-11-07 06:36:18

+0

@Voo:沒有,只是實現定義。如果你願意,有一些技巧可以使它完全便攜,但需要付出一些代價。 – 2014-11-07 14:10:03

+0

由於一個整數大於指針的實現在理論上是可行的,我想,你會怎麼做呢?有趣的問題。 – Voo 2014-11-07 17:58:24

相關問題