這是我的情況,我有一個服務器偵聽連接,並且我現在正在編程一個客戶端。客戶端無法從服務器接收任何內容,但它必須每3分鐘發送一次狀態更新。客戶端到服務器連接只發送不接收
我此刻的以下內容:
WSAStartup(0x101,&ws);
sock = socket(AF_INET,SOCK_STREAM,0);
sa.sin_family = AF_INET;
sa.sin_port = htons(PORT_NET);
sa.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock,(SOCKADDR*)&sa,sizeof(sa));
send(sock,(const char*)buffer,128,NULL);
我的方法應該如何呢?我可以避免循環recv?
如果我每次發送內容時關閉連接,並在下次需要發送內容時打開一個新連接,這樣我就可以避免阻塞。聽上去怎麼樣? – 2012-04-13 15:04:49
是的,你可以做到這一點(事實上,如果你只是推動狀態更新,你可能也會如此)。問題在於服務器將在accept()上被阻塞,而不僅僅是在讀取數據時。基本上你的服務器不能保證連接何時發生,因此需要不斷的收聽。你可以設置一個超時(兩端),並依靠雙方知道它們意圖形成連接的時間,但這是一個容易出錯的問題。編輯:但是,如果你的服務器需要做的唯一事情是進程狀態更新,那麼是的,這可以正常工作。 – Bhau 2012-04-13 15:22:54
好吧,我不介意服務器是否在不停地收聽。我最初的問題是我在不關閉連接的情況下調用send(),並且只發送第一個狀態,並且我在類似案例中閱讀了這裏(http://stackoverflow.com/q/8347107/777510)我需要調用recv併發送一個循環來避免這種情況,我所要求的是如果我可以通過發送和關閉連接來避免該循環。所以我應該罰款嗎? – 2012-04-13 15:42:46