用C一步步開發web伺服器(2)

2021-07-27 20:00:52 字數 3509 閱讀 2514

順著教程1往下走,這個章節我們需要開發支援併發的web伺服器,並加入容錯處理

首先加入容錯處理,建議將socket函式封裝在新的wrap_socket.c檔案中,並建立他的.h檔案,server端include該檔案,重寫server端的部分**。

wrap_socket.c檔案應該是這樣的:

#include "wrap_socket.h"

#define maxline 1000

void p_error(char *str)

/**************************=*/

/* 這裡是所有socket方法的封裝*/

/**************************=*/

int socket(int family,int type,int protocol)

return socketfd;

}void bind(int fd, const

struct sockaddr *sa, socklen_t len)

void listen(int fd,int backlog_size)

int accept(int fd,const

struct sockaddr *sa,socklen_t *len)

void connect(int fd,const

struct sockaddr *sa,socklen_t len)

long read(int fd, void *buf, size_t len)

void write(int fd, void *buf, size_t len)

void close(int fd)

當然他對應的wrap_socket.h應該是這樣的:

#ifndef wrap_socket_h

#define wrap_socket_h

#include

#include

#include

//read方法需要的標頭檔案

#include

//socket方法需要的標頭檔案

#include

#include

//htonl 方法需要的標頭檔案

#include

//inet_ntop方法需要的標頭檔案

#include

#include

#include

#include

#include

int socket(int family,int type,int protocol);

int num_sum(int a,int b);

void bind(int fd, const

struct sockaddr *sa, socklen_t len);

void listen(int fd,int backlog_size);

int accept(int fd,const

struct sockaddr *sa,socklen_t *len);

void connect(int fd,const

struct sockaddr *sa,socklen_t len);

long read(int fd, void *buf, size_t len);

void write(int fd, void *buf, size_t len);

void close(int fd);

#endif /* wrap_socket_h */

這個時候 需要重寫下webserver.c的部分在wrap_socket中封裝的socket部分函式了
listenfd = socket(af_inet, sock_stream, 0);

//初始化myaddr引數

bzero(&servaddr, sizeof(servaddr)); //結構體清零

//對servaddr 結構體進行賦值

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = htonl(inaddr_any);

servaddr.sin_port = htons(serv_port);

bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

listen(listenfd, backlogsize);

這個時候,跑下程式吧。調下bug,看看能不能順利執行

接下來我們可以這樣嘗試,在開啟乙個client 與server互動的時候,再開啟另乙個client連線server,看能不能順利執行,為什麼?

這時候程式要能夠支援併發的能力,就需要fork()這個方式,找個簡單的例子說明下fork是這樣的執行方式的(網上找的,勿噴)

#include 

#include

int main ()

else

printf("統計結果是: %d/n",count);

return

0;

}

當然我們這個程式也是要加上這個fork進行併發處理的,話不多說,獻上**

//死迴圈中進行accept()

while (1) else

if(pid == 0)

printf("received from %s at port %d,message is %s\n",

inet_ntop(af_inet, &cliaddr.sin_addr, str, sizeof(str)),

ntohs(cliaddr.sin_port),buf);

for (i = 0; i < n; i++)

buf[i] = toupper(buf[i]);

write(connfd, buf, n);

}close(connfd);

exit(0);

}else

}

到此,大家試一試執行下,再開啟新的client看看能不能順利訪問,我們還可以通過linux命令檢視程序情況

ps -ef | grep webserver
初次啟動是這樣的

然後執行client,並多執行幾次,就可以看到程序數在增加

好了,這個章節關於錯誤處理以及fork的內容到這了,第3章就開始真正進行web伺服器的開發了

一步步搭建web伺服器 2

接下來將red hat的yum源更換為centos yum源。1 刪除linux自帶yum源 rpm aq grep yum xargs rpm e nodeps 163源位址是 當我們去這個位址檢視的時候發現當前源404未找到,然後可以繼續向下找其他版本,最終在 找到,此處選擇使用6.7的源 wg...

用Django一步步建立專案(一)

平台 windows10,pycharm community2018 版本 python3.6,django3.1,mysql8.0.11 引用參考 一 建立專案 1.cmd進入命令提示符編輯介面或開始選單中選擇命令提示符,用cd命令轉到要建立django專案的資料夾中。2.進入目錄後,執行如下命令...

一步步教你開始使用Python開發Web應用

python 是乙個通用程式語言,並很快成為每個自重程式設計師寶庫中的乙個必需品。python中有數不清的web框架 從基本的微小架構到完整的架構,它們自有各自的優點。那麼你準備使用它來做一些web開發,但在 細節之前,讓我們從頭開始。學習python的基礎 截至目前,python有兩個版本,2.7...