簡體   English   中英

套接字客戶端使用服務器接受的連接發送

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM