下面是建立乙個簡單伺服器的基本流程,所用的埠是8099。後面貼了**。
一、基本流程:
建立套接字建立套接字配置伺服器位址相關引數
將兩者繫結
監聽套接字上的埠
在上面建立的套接字上等待連線,並開啟乙個新的套接字用於與請求之間的互動
在傳送緩衝區中寫入響應
關閉連線
listenfd =
socket
(af_inet, sock_stream,0)
;if(listenfd <0)
函式配置伺服器位址相關引數socket()
所在的標頭檔案為sys/socket.h
,宣告為extern int socket (int __domain, int __type, int __protocol) __throw;
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr =
htonl
(inaddr_any)
;servaddr.sin_port =
htons
(port)
;
變數將上面兩者繫結servaddr
的型別為struct sockaddr_in
,它所在的標頭檔案為netinet/in.h
。
int bind_ok =
bind
(listenfd,
(struct sockaddr *
)&servaddr,
sizeof
(servaddr));
if(bind_ok <0)
函式監聽套接字上的埠bind()
所在的標頭檔案為sys/socket.h
,宣告為extern int bind (int __fd, __const_sockaddr_arg __addr, socklen_t __len) __throw;
int listen_ok =
listen
(listenfd, listenq);if
(listen_ok <0)
函式在上面建立的套接字上等待連線,並開啟乙個新的套接字用於與請求之間的互動listen()
所在的標頭檔案為sys/socket.h
,宣告為extern int listen (int __fd, int __n) __throw;
connfd =
accept
(listenfd,
null
,null);
if(connfd <0)
函式在傳送緩衝區中寫入響應accept()
所在的標頭檔案為sys/socket.h
,宣告為extern int accept (int __fd, __sockaddr_arg __addr, socklen_t *__restrict __addr_len);
write_ok =
write
(connfd, buffer.
c_str()
,strlen
(buffer.
c_str()
));if
(write_ok <0)
函式關閉連線write()
所在的標頭檔案為unistd.h
,宣告為
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;
函式
close()
所在的標頭檔案為unistd.h
,宣告為
extern int close (int __fd);
close
(connfd)
;
二、編譯、執行、驗證$ # 編譯
$ g++ ******_server.cpp -o run_this
$ # 執行
$ ./run_this
$ # 開啟乙個新的shell視窗,然後執行下面的命令
$ # 執行後,新的shell視窗會有如下的顯示結果:
hello, this is a ****** server.
$ # 執行 run_this 的視窗中,當伺服器接收到請求之後,會顯示如下的結果:
hello, this is a ****** server.
length of it: 32
三、**#include
// std::cout、std::endl
#include
// socket、bind、listen、accept
#include
// htonl、htons
#include
// write、close
#include
// bzero
#define port 8099
#define listenq 5
intmain()
/* 準備位址埠資訊 */
// 常量 inaddr_any 位於 netinet/in.h
bzero
(&servaddr,
sizeof
(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr =
htonl
(inaddr_any)
; servaddr.sin_port =
htons
(port)
;/* 繫結套接字與位址埠 */
int bind_ok =
bind
(listenfd,
(struct sockaddr *
)&servaddr,
sizeof
(servaddr));
if(bind_ok <0)
/* 監聽埠 */
int listen_ok =
listen
(listenfd, listenq);if
(listen_ok <0)
/* 準備這個簡單伺服器返回的資訊 */
std::string buffer =
"hello, this is a ****** server.\n"
;int write_ok;
// 用於判斷是否成功將資料寫入傳送快取
// 迴圈等待
while(1
) std::cout << buffer << std::endl <<
"length of it: "
<< buffer.
size()
<< std::endl;
// 將響應的資料寫入傳送緩衝區
write_ok =
write
(connfd, buffer.
c_str()
,strlen
(buffer.
c_str()
));if
(write_ok <0)
// 關閉連線
close
(connfd);}
}
用python寫乙個簡單的web伺服器
人生苦短,我用python 簡潔高效,這才是理想的語言啊 分享一點python的學習經驗 如何用python寫乙個簡單的web伺服器 首先,我們需要簡單地了解一下網路通訊協議,這裡用白話介紹一下tcp和udp這兩種傳輸層的協議 tcp 通訊過程之中每次通訊都會進行確認操作,確保報文的安全送達,相當於...
用C寫乙個web伺服器(一) 基礎功能
c 語言是一門很基礎的語言,程式設計師們對它推崇備至,雖然它是我的入門語言,但大學的 c 語言知道早已經還給了老師,c 的使用可以說是從頭學起。之前一直在讀書,看了 c primer plus apue unp 第一本看完之後雖然對 c 的語法有了大概的了解,可是要說應用,還差得很遠 後兩本算是咬著...
寫乙個索引伺服器
今天把 jaxb 返回的 xml 物件 轉到了 lucene 的 document 然後仍給 index search 一把。還算順利搞定。接下來開始解決網路介面。寫乙個基於netty的索引伺服器。接收client仍過來的xml資料報。關於netty的資料除了 url 還有一部分中文的。url 大致...