專案描述:運用 socket 程式設計,實現了服務端對客戶端的廣播和**客戶端資訊實現客戶端聊天操作,並使用 i/o 復用技術中的 epoll 模式解決了乙個執行緒可以處理大量使用者連線伺服器的請求,提高了伺服器併發連線的數量。同時利用執行緒池來管理各個執行緒的工作,避免了建立和銷毀執行緒的開銷,因此使伺服器更加高效。
server伺服器:
client客戶端:// 一伺服器 -> 多客戶端
// 三次握手主要是建立連線
// 四次揮手主要是釋放資源
// i/o復用 epoll模式
#include
#include
#include
#include
// bzero()
#include
#include
// remove()
#include
#include
// max_element()
#include
// epoll()
#include
// open_max
using
namespace std;
void
show_connect
(int fd)
// ./server ip port
intmain
(int argc,
char
* ar**)
// 1. 監聽套接字
int listenfd =
socket
(af_inet,sock_stream,0)
;if(-
1== listenfd)
// 為了避免埠被占用,想要再次使用同乙個埠
// 設定埠重複利用(一般用在除錯中)
int flag =1;
setsockopt
(listenfd,sol_socket,so_reuseaddr,
&flag,
sizeof
(flag));
// 2. 繫結
struct sockaddr_in local_addr;
local_addr.sin_family = af_inet;
// ipv4協議
local_addr.sin_addr.s_addr =
inet_addr
(ar**[1]
);// ip位址
local_addr.sin_port =
htons
(atoi
(ar**[2]
));// 埠號if(
-1==bind
(listenfd,
(struct sockaddr*
)&local_addr,
sizeof
(local_addr)))
else
// 3. 監聽設定if(
-1==listen
(listenfd,10)
)else
int epollfd =
epoll_create
(inr_open_max)
;struct epoll_event evt;
evt.data.fd = stdin_fileno;
evt.events = epollin;
epoll_ctl
(epollfd,epoll_ctl_add,stdin_fileno,
&evt)
; evt.data.fd = listenfd;
epoll_ctl
(epollfd,epoll_ctl_add,listenfd,
&evt)
;int count =2;
list<
int> fds;
while
(true)}
}else
if(revt[i]
.data.fd == listenfd && revt[i]
.events & epollin)
else
}else
;int n =
read
(connfd,buffer,
1024);
// 讀取客戶端發過來的資訊
if(n ==0)
else}}
}}close
(epollfd)
;// 7. 關閉套接字
close
(listenfd)
;}
// 三次握手主要是建立連線
// 四次揮手主要是釋放資源
// i/o 復用 epoll模式
#include
#include
#include
#include
// bzero()
#include
//#include
#include
// epoll()
#include
// open_max
using
namespace std;
string name;
void
show_connect
(int fd)
// ./clinet ip port name
intmain
(int argc,
char
* ar**)
name = ar**[3]
;// 1.建立連線套接字
int connfd =
socket
(af_inet,sock_stream,0)
;if(-
1== connfd)
// 2. 連線伺服器
struct sockaddr_in remote_addr;
// in是internet簡寫
remote_addr.sin_family = af_inet;
// 協議 sin是sockaddr_in的縮寫
remote_addr.sin_addr.s_addr =
inet_addr
(ar**[1]
);// ip位址
remote_addr.sin_port =
htons
(atoi
(ar**[2]
));// 埠號 小端轉大端if(
-1==connect
(connfd,
(struct sockaddr*
)&remote_addr,
sizeof
(remote_addr)))
else
// 建立epoll描述符
int epollfd =
epoll_create(2
);// 註冊事件
struct epoll_event evt;
evt.data.fd = stdin_fileno;
evt.events = epollin;
epoll_ctl
(epollfd,epoll_ctl_add,stdin_fileno,
&evt)
; evt.data.fd = connfd;
evt.events = epollin;
epoll_ctl
(epollfd,epoll_ctl_add,connfd,
&evt)
;bool stop =
false
;while
(!stop)
else
if(revt[i]
.data.fd == connfd && revt[i]
.events & epollin)
;int len =
read
(connfd,buffer,
sizeof
(buffer));
if(len ==0)
else}}
}close
(epollfd)
;// 5. 關閉套接字
close
(connfd)
;return0;
}
基於TCP IP協議的網路程式設計
基於tcp ip協議的網路程式設計 定義變數 獲得winsock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放所有資源 整個程式架構分為兩大部分,伺服器端客戶端。伺服器socket程式流程 socket bind listen accept...
基於java的TCP IP協議理解
tcp ip協議的工作流程如下 在源主機上,應用層將一串應用資料流傳送給傳輸層。傳輸層將應用層的資料流截成分組,並加上tcp報頭形成tcp段,送交網路層。在網路層給tcp段加上包括源 目的主機ip位址的ip報頭,生成乙個ip資料報,並將ip資料報送交鏈路層。鏈路層在其mac幀的資料部分裝上ip資料報...
基於TCP IP協議實現檔案傳輸
public class fileserver extends thread override public void run 將map集合傳送到客戶端 oos.writeobject map oos.flush 2.接收客戶端傳送的檔案序號 scanner sc new scanner s.get...