用C 寫乙個簡單的伺服器 Linux

2021-09-30 16:59:01 字數 4404 閱讀 9841

下面是建立乙個簡單伺服器的基本流程,所用的埠是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 大致...