簡體   English   中英

如果在同一個套接字上設置多個連接,哪個套接字描述符接收數據?

[英]Which socket descriptor receives the data if multiple connections set on same socket?

我有一個服務器程序。 代碼片段如下;

int sd = socket(AF_INET , SOCK_STREAM , 0);
....
//socket is set a a non blocking socket
....
bind(sd, (struct sockaddr *)&address, sizeof(address));
...
listen(sd, 3);
..
int i = 0;
while(TRUE) {
int new_sd[i] = accept(sd,sockadd,sockadd_len);
i++;
}

場景是 3 個客戶端連接到此服務器/套接字。 當這些客戶端開始向該服務器發送數據時,哪個套接字描述符將在服務器中具有該 (new_sd[0],new_sd[1],new_sd[2])? 數據將如何分布在不同的套接字描述符之間?

accept()返回的套接字描述符將包含與發起由accept()的連接的客戶端進行通信的值。

你有代碼:

int i = 0;
while(TRUE) {
    int new_sd[i] = accept(sd, sockadd, sockadd_len);
    i++;
}

這是一場災難。 您創建一個零長度數組(這不是有效的標准 C,盡管 GCC 允許),然后嘗試訪問數組邊界之外的元素(零長度數組中沒有有效元素)。 您的循環丟棄了數組,然后嘗試寫入現在大小為 1 的數組的邊界之外(只有new_sd[0]有效,但您可以訪問new_sd[1] )。 理論上,每次迭代都會放棄舊數組,所有值都變得不確定。 您需要預先分配一個足夠大的數組來容納接受的連接,或者使用動態 memory 分配( malloc()等)在循環時創建一個。 您通常不應該在每次迭代時簡單地向數組添加一個元素。 顯然,缺少實際從接受的套接字描述符中讀取的代碼。 您還需要清理數組以刪除與客戶端通信完成並且您已關閉套接字描述符的條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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