linuxsocket並發
1. linux Socket編程求助啊,一個伺服器和多個客戶端通信問題求助
如果客戶端並發連接數不是很大,比如50個以下,可以用如下模型:
建立一個監聽主線程,循環監聽埠。
當有客戶端連接時,建立客戶端通訊線程,並保留客戶端socket到鏈表中。
當客戶端斷開連接時,從socket鏈表中刪除該socket。
2. linux c socket 如何實現一個進程多個線程,每個線程管理多個socket連接
大家仔細看,樓主的題目還是很有難度的呢,一個進程多個線程容易實現,但是要讓這些線程中每個線程都管理多個socket連接,確實比較難~~坐等高手。
不過一般都是一個線程處理一個socket連接,這種例子是:
(取自書上,僅供學習,直接編譯肯定通不過,少書上其他代碼)
==================================================
/* include serv06 */#include "unpthread.h"
intmain(int argc, char **argv)
{
int listenfd, connfd;
void sig_int(int);
void *doit(void *);
pthread_t tid;
socklen_t clilen, addrlen;
struct sockaddr *cliaddr;
if (argc == 2) listenfd = Tcp_listen(NULL, argv[1], &addrlen);
else if (argc == 3)
listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
else
err_quit("usage: serv06 [ <host> ] <port#>");
cliaddr = Malloc(addrlen);
Signal(SIGINT, sig_int);
for ( ; ; ) { clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
Pthread_create(&tid, NULL, &doit, (void *) connfd); }
}
void *doit(void *arg)
{
void web_child(int);
Pthread_detach(pthread_self()); web_child((int) arg);
Close((int) arg);
return(NULL);
}
/* end serv06 */
voidsig_int(int signo)
{
void pr_cpu_time(void);
pr_cpu_time(); exit(0);
}
================================================================
3. Linux支持最大的SOCKET連接數量是多少
並發socket連接數的多少決定於系統資源的多少,沒有一個常值的.在實際開發或者linux系統管理中也會根據需要進行相應的設置.
1.一般來說每一個網路連接,都會建立相應的socket句柄,同時每個連接也會有標准輸入輸出等基本的文件文件句柄,而且每一個socket連接都是進行文件操作的,因此連接數決定於系統資源.
2.Linux上一般可以通過ulimit來進行相應的資源限制,默認能打開的文件描述符自己可以查看.如下圖所示:
3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]
參數說明:
-H 設置硬資源限制.
-S 設置軟資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
-u <程序數目> 用戶最多可開啟的程序數目
4. Linux支持最大的SOCKET連接數量是多少
$ ulimit -n
1024
這表示當前用戶的每個進程最多允許同時打開1024個文件,這1024個文件中還得除去每個進程必然打開的標准輸入,標准輸出,標准錯誤,伺服器監聽 socket,進程間通訊的unix域socket等文件,那麼剩下的可用於客戶端socket連接的文件數就只有大概1024-10=1014個左右。也就是說預設情況下,基於Linux的通訊程序最多允許同時1014個TCP並發連接。
5. linux tcp socket並發編程,調用accept函數後調用fork。兩台電腦測試,為何accept返回的描述符是相同的
可能是你的fork 之後產生的子進程拷貝的代碼,它那裡執行了accept,所以導致相同,你試著在每個fork之後的函數中用個exit(1);將子進程退出,然後應該就不會有這個問題了。
