服務端
#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...