我目前正試圖獲得通過AF_UNIX
插座並運行的客戶端/守護通信。C++ - AF_UNIX插座掛
目前客戶端成功發送一條消息,守護進程接收和處理,然後應將郵件發送回來。
那麼,這就是問題所在。只要守護程序嘗試將消息發送回來,客戶端就會掛起,試圖讀取消息,如果我終止了客戶端,守護進程將隨着它而死。
以下是後臺代碼:
//successful call to accept, I have a file descriptor now...
int c = 0;
while((c = recv(fd, (char*)&buf[0], bufferSize, 0)))
{
if(c == -1 || c == 0)
break;
tmp.append(buf.begin(), buf.begin()+c);
}
writeLog(tmp);
tmp = evaluateMsg(tmp);
writeLog(tmp);
//I assume this send call is hanging
if(send(fd, tmp.c_str(), tmp.size(), 0) < 0)
writeLog("Could not write message back!");
close(fd);
這是客戶端代碼:
//connect(); is successful
//send(); as well - the recv(); call is hanging forever
while((c = recv(sockfd, (char*)&buf[0], 1024, 0)))
{
if(c == -1)
{
cout<<"Error";
break;
}
else if(c == 0)
break;
tmp.append(buf.begin(), buf.begin()+c);
}
請注意,該代碼是大量削減用於簡化和可讀性的原因(尤其是代碼爲daemonize
並創建實際的AF_UNIX
套接字(這兩個都是成功的))。
UPDATE:
我可以驗證客戶端recv()
呼叫不會被恢復,這意味着守護方send()
電話掛。爲什麼?
客戶端之後將消息發送給你的代碼,看來它關閉套接字。那將使'發送() '失敗 –
不,它不。不幸的是,這並不是那麼簡單(; –
與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或對[so]進行簽名。請參閱「[應該'嗨','謝謝''標語和稱呼從撤職?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts)。 –