前面已經寫了一篇簡單的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...