Linux socket多執行緒實現回聲伺服器

2021-10-08 19:37:22 字數 4133 閱讀 8835

服務端

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define connnum 10

int fd_connect[connnum]=;

// 連線描述符陣列

int fd_sock;

// 套接字描述符

pthread_mutex_t mutex = pthread_mutex_initializer;

// 互斥鎖

// 伺服器初始化

void

server_init

(short port)

;// 伺服器執行

void

server_run()

;// 伺服器結束

void

server_end()

;// 資料處理

void

*data_handle

(int fd_conn)

;// 執行緒入口函式

void

*thread_func

(void

*arg)

;int

main

(int argc,

char

const

*ar**)

server_init

(atoi

(ar**[1]

));server_run()

;server_end()

;return0;

}// 伺服器端初始化

void

server_init

(short port)

// 準備通訊位址

struct sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port =

htons

(port)

; addr.sin_addr.s_addr =

htonl

(inaddr_any)

;// 繫結

int res =

bind

(fd_sock,

(const

struct sockaddr *

)&addr,

sizeof

(addr));

if(res ==-1

)printf

("bind success!\n");

// 監聽

res =

listen

(fd_sock,10)

;if(res ==-1

)printf

("server init success!\n");

}// 伺服器端執行

void

server_run()

printf

("new connection!\n");

pthread_t tid;

// 建立新執行緒

int res =

pthread_create

(&tid,

null

, thread_func,

(void*)

(long

)fd_conn);if

(res !=0)

// 設定執行緒屬性為分離

pthread_detach

(tid)

;// pid_t pid = fork(); // 建立子程序

// if (pid == -1)

// // else if (pid == 0) // 子程序

// }

}// 資料處理

void

*data_handle

(int fd_conn)

}pthread_mutex_unlock

(&mutex)

;// 接收資料

char str[

512]=;

struct sockaddr_in client_addr;

socklen_t addrlen =

sizeof

(client_addr)

;getpeername

(fd_conn,

(struct sockaddr *

)&client_addr,

&addrlen)

;printf

("[%s : %d] online!\n"

,inet_ntoa

(client_addr.sin_addr)

, client_addr.sin_port)

;while(1

)else

if(r ==0)

// 對端關閉連線

printf

("recv data: %s\n"

, str);if

(!strcmp

(str,

"end"))

break

;pthread_mutex_lock

(&mutex)

;for

(int i =

0; i <

10; i++

)// **訊息}}

pthread_mutex_unlock

(&mutex);}

printf

("[%s : %d] offline!\n"

,inet_ntoa

(client_addr.sin_addr)

, client_addr.sin_port)

;pthread_mutex_lock

(&mutex)

; fd_connect[index]=0

;pthread_mutex_unlock

(&mutex)

;close

(fd_conn);}

void

server_end()

// 執行緒函式

void

*thread_func

(void

*arg)

客戶端

/*

* @descripttion:

* @version:

* @author: chilk

* @date: 2020-07-29 17:01:23

* @lasteditors: chilk

* @lastedittime: 2020-08-01 09:54:54

*/#include

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

const

*ar**)

struct sockaddr_in info;

info.sin_family = af_inet;

// info.sin_port = htons(54321);

info.sin_port =

htons

(atol

(ar**[2]

)); info.sin_addr.s_addr =

inet_addr

(ar**[1]

);// info.sin_addr.s_addr = htonl(inaddr_any);if(

connect

(sockfd,

(const

struct sockaddr *)(

&info)

,sizeof

(struct sockaddr))==

-1)printf

("連線成功\n");

while(1

)close

(sockfd)

;return0;

}

linux socket程式設計(多執行緒)

1,客戶端 include include include include include include include include include include 強調 當客戶端連線伺服器時,伺服器會產生乙個新的檔案描述符 套接字 與客戶端互動,這個新的套接字不是伺服器端的監聽套接字 套接字...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...

多執行緒簡單例項 beginthreadx實現

使用 beginthreadex 函式,需使用標頭檔案,且進行編譯環境的設定 詳見上篇文章 執行緒的建立和終止 c include include include using namespace std static unsigned stdcall thread1 void param stati...