tcp通訊的程式設計模型如下:
tcp通訊是必須要有乙個伺服器,通過accept
函式與客戶端socket進行三次握手連線建立的通訊描述符與客戶端進行資料傳輸。
此時可以將accept函式的連線設定為多執行緒形式,輪訓監聽,每獲取到乙個客戶端的連線,則建立乙個子執行緒專門用於和該客戶端進行通訊。
實現**如下:
server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ip "192.168.102.175"
#define port 7000
void
print_err
(char
*str,
int line,
int err_no)
/*子執行緒中先接收從客戶端發來的訊息,再傳送乙個訊息給客戶端*/
void
*receive
(void
*pth_arg)
;while(1
)else
if(ret >0)
printf
("recv from client %s \n"
,buf)
; ret =
send
(cfd,
"recv ok\n"
,sizeof
("recv ok\n"),
0);if
(-1== ret)
print_err
("send failed"
,__line__
, errno);}
}int
main()
struct sockaddr_in addr;
addr.sin_family = af_inet;
//設定tcp協議族
addr.sin_port =
htons
(port)
;//設定埠號
addr.sin_addr.s_addr =
inet_addr
(ip)
;//設定ip位址
ret =
bind
(skfd,
(struct sockaddr*
)&addr,
sizeof
(addr));
if(-1
== ret)
ret =
listen
(skfd,3)
;if(-
1== ret )
//使用accept阻塞形式得監聽客戶端的發來的連線,並返回通訊描述符
long cfd =-1
; pthread_t id;
while(1
);int csize =
sizeof
(caddr)
; cfd =
accept
(skfd,
(struct sockaddr*
)&caddr,
&csize);if
(-1== cfd)
//建立連線後列印一下客戶端的ip和埠號
printf
("cport = %d, caddr = %s\n"
,ntohs
(caddr.sin_port)
,inet_ntoa
(caddr.sin_addr));
//使用accept返回到描述符,建立子執行緒進行資料傳輸
int ret =
pthread_create
(&id,
null
,receive,
(void
*)cfd);if
(-1== ret)
print_err
("accept failed"
,__line__
, errno);}
return0;
}
客戶端的**一樣的,主要是進行資料傳送和接收
client1.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ip "192.168.102.175"
#define port 7000
void
print_err
(char
*str,
int line,
int err_no)
intmain()
struct sockaddr_in addr;
addr.sin_family = af_inet;
//設定tcp協議族
addr.sin_port =
htons
(port)
;//設定埠號
addr.sin_addr.s_addr =
inet_addr
(ip)
;//設定ip位址
//主動傳送連線請求
ret =
connect
(skfd,
(struct sockaddr*
)&addr,
sizeof
(addr));
if(-1
== ret)
print_err
("connect failed"
,__line__
, errno)
;char buf[
100]=;
char rec[
100]=;
//客戶端傳送訊息,並接受從服務端返回的訊息
while(1
)bzero
(&rec,
sizeof
(recv));
ret =
recv
(skfd,
&rec,
sizeof
(rec),0
);if(
-1== ret)
print_err
("recv failed"
,__line__
, errno)
;else
if(ret >0)
printf
("recv from server %s\n"
,rec);}
return0;
}
client2.c
和client1.c
一樣,這裡需要注意的是我在本機進行測試,所以客戶端建立連線的服務端ip和埠號就和服務端一致。如果是跨網通訊(跨區域網),這裡需要填寫伺服器 所在區域網路由器的公網ip。
這裡我們建立兩個客戶端,向與服務端進行通訊
編譯執行:
gcc server.c -o server -pthread
gcc client1.c -o client1 -pthread
gcc client2.c -o client2 -pthread
先執行server,再分別執行兩個客戶端
檢視伺服器的執行緒個數有三個,乙個主線程,兩個子執行緒
zhang@ubuntu:
~/desktop/cpp_practice$ ps -tp 24567
pid spid tty time cmd
24567
24567 pts/200
:00:00 server
24567
24569 pts/200
:00:00 server
24567
24604 pts/200
:00:00 server
C 語言多執行緒程式設計
一 linux 下相關函式 函式描述 intpthread create pthread t thread,pthread attr t attr,void start routine void void arg 建立乙個新的執行緒。編譯時帶上 lpthread.引數說明 thread 是乙個指標,...
多執行緒網路程式設計
與多程序程式設計對比 1 建立多程序相比起建立多執行緒會 消耗大量的系統資源 2 程序結束比起執行緒結束,釋放的資源也更多,子程序很快結束,系統負擔加重 3.多執行緒由於在同乙個程序中,很多資源是共用的。所以執行緒間資料共享也非常高效快捷。需要注意的兩點是 1.由於多執行緒在乙個程序中,乙個程序只有...
C語言多執行緒程式設計基礎
我們進行多執行緒程式設計,可以有多種選擇,可以使用windowsapi,如果你在使用gtk,也可以使用gtk實現了的執行緒庫,如果你想讓你的程式有更多的移植性你最好是選擇posix中的pthread函式庫,我的程式是在linux下寫的,所以我使用了pthread庫 是不是很傷心,我知道有不少人期待的...