基於多執行緒多客戶端連線的TCP模型

2021-09-28 19:32:48 字數 3759 閱讀 3548

前面已經寫了一篇簡單的tcp模型,用於單執行緒單客戶端鏈結,這種效率最高,但是適用場景也是最小的。今天再測試一番簡單的多執行緒多客戶端連線的tcp模型。== 這種模型目前也不常見,因為已經有很多的io復用模型了 ==。但是基於對循序漸進的尊重,我依舊對這個模型進行了一次實驗。

/*!

* \file mth_srv.c

* \date 2019/10/12 16:47

* * \author locki

* contact: [email protected]

* * \brief 多執行緒處理多連線

* * todo: long description

* * \note

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

"mth_srv.h"

srv_msg_t mgr ;

void

*cli_proc

(void

* ar**)

;while

(len =

recv

(client->_fd, buf,

1024,0

)>0)

// 對端斷開;需要將管理中此客戶端置為斷開

client->_status = sock_discon;

close

(client->_fd);}

inttest_mthsrv

(int argc,

char

** ar**)

;inet_aton

("127.0.0.1"

,&srvaddr.sin_addr)

; srvaddr.sin_family = af_inet;

srvaddr.sin_port =

htons

(8888);

if(-1

==bind

(fd,

(struct sockaddr*

)&srvaddr,

sizeof

(srvaddr)))

mgr._addr = srvaddr;if(

-1==(ret =

listen

(fd,10)

))printf

("listening...\n");

while

(mgr._cli_count < max_client)

; socklen_t len =

sizeof

(cliaddr);if

(-1==

(clifd =

accept

(fd,

(struct sockaddr*

)&cliaddr,

&len)))

printf

("new client, %s:%d fd = %d"

,inet_ntoa

(cliaddr.sin_addr)

,ntohs

(cliaddr.sin_port)

, clifd)

;// 有新客戶端連線;

cli_node_t* climgr =

(cli_node_t*

)calloc(1

,sizeof

(cli_node_t));

climgr->_fd = clifd;

climgr->_addr = cliaddr;

mgr.cli[mgr._cli_count++

]= climgr;

// 啟動乙個客戶端執行緒if(

0==pthread_create

(&climgr->_thread_id,

null

, cli_proc, climgr))}

// 客戶端過多;

printf

("client nums is %d ---\n"

, mgr._cli_count)

;sockexit:

close

(fd)

;return ret;

}

mth_srv.h

/*!

* \file mth_srv.h

* \date 2019/10/12 16:55

* * \author locki

* contact: [email protected]

* * \brief 多執行緒socket標頭檔案

* * todo: long description

* * \note

*/typedef

struct cli_node_s cli_node_t;

typedef

struct srv_mgr_s srv_msg_t;

typedef

int(

*onrecv)

(int fd,

char

* data,

int datalen,

void

* hint)

;#define max_client 100

#define sock_conn 1

#define sock_discon 2

struct cli_node_s

;struct srv_mgr_s

;#pragma once

/*!

* \file mth_cli.c

* \date 2019/10/14 19:53

* * \author ycd

* contact: [email protected]

* * \brief 多連線測試客戶端

* * todo: long description

* * \note

*/#include

#include

#include

#include

#include

#include

#include

inttest_mthcli

(int argc,

char

** ar**)

;for

(int i =

0; i <

100; i++);

addr.sin_addr.s_addr =

inet_addr

("192.168.0.195");

addr.sin_port =

htons

(8888);

addr.sin_family = af_inet;

ret =

connect

(mthcli[i],(

struct sockaddr*

)&addr,

sizeof

(addr));

if(ret ==-1

)printf

("connect to host success\n");

}char buf[32]

=;while(1

)}usleep

(1000);

printf

("send success\n");

}}

QTcpServer實現多客戶端連線

qtcpserver使用請見 qtcpsocket qt使用tcp通訊實現服務端和客戶端 qtcpserver類預設提供的只有無引數的newconnection的訊號,這樣雖然知道有人連線了,並且可以通過nextpendingconnection獲取連線的socket,但並不便於管理,尤其是在連線斷...

TCP通訊,多客戶端通訊(客戶端 服務端)

客戶端和伺服器間的交流,客戶端傳送資訊,伺服器接收到,並返回資訊 長連線建立socket連線服務端 指定ip位址,埠號 通過ip位址找對應的伺服器 呼叫socket的getinputstream 和getoutputstream 方法獲取和服務端相連的io流 輸入流可以讀取服務端輸出流寫出的資料 輸...

多執行緒TCP客戶端的設計

一 首先了解一下tcp客戶端設計的編寫步驟 1 使用wsastartup 初始化winsock庫。2 使用socket 建立乙個ipproto tcp型別的套接字。3 使用 gethostname gethostbyaddr 獲取主機的相關資訊。4 使用connect 連線到伺服器。5 使用send...