C語言網路程式設計 TCP實現多執行緒實現多客戶端

2021-09-28 17:20:50 字數 4325 閱讀 3109

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.cclient1.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庫 是不是很傷心,我知道有不少人期待的...