[英]Socket Client send using connection accepted by Server
客戶端使用服務器接受的相同連接發送數據的方法正確嗎?
情況是這樣的,我的PC上運行着藍牙服務器,另一方面,我的Android手機帶有客戶端和服務器。 從android客戶端開始連接。 我正在使用android示例中的藍牙聊天示例。
和Android上的服務器客戶端看起來像
BluetoothSocket socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
在PC端,我正在使用Bluez庫來實現服務器和客戶端。
該代碼包括藍牙接收線程和主線程,每當服務器接受來自android手機的連接時,我只是將套接字值分配給全局變量,並且每當客戶端需要使用同一套接字發送它發送的數據時,
服務器:-
int GLOBAL_CLIENT;
void* recive_bluetooth_trd(void*)
{
...............................
..............................
client = accept(s, (struct sockaddr *)&rem_addr, &opt);
GLOBAL_CLIENT=client;
while(1){
bytes_read = read(client, buf, sizeof(buf));
....................
...................
}
客戶:-
void clinet(char *msg, int length){
........................
int bytes_write=write(GLOBAL_CLIENT,message, length);
..........................
}
我的問題是,這是正確的方法嗎? 問題在於,有時客戶端會從PC成功發送數據,但無法在android端接收數據。
對我來說似乎是正確的,但是在read
后,如果要使用字符串,則必須NUL
( '\\0'
)終止緩沖區:
buf[bytes_read] = '\0';
我看到的最大問題是,即使客戶端斷開連接,您也永遠不會離開while(1)
循環。 讀取將立即永久返回,並讀取0字節(檢查返回代碼<= 0),試圖表明套接字已斷開連接。 您的代碼將進入緊密的無限循環,並耗盡所有可以單線程使用的CPU資源。
您需要確保始終檢查套接字和IO返回碼並正確處理錯誤。 套接字的錯誤處理通常約為實際套接字代碼的3倍。
除非..........
當然是重要的東西。 當人們隱藏與他們所問問題相關的代碼時,總是很難分辨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.