最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C語言編寫一個簡單的Web服務器

 更新時間:2024年03月11日 09:50:38   作者:自信人間三百年  
C語言可以干大事,這篇文章主要為大家詳細介紹了如何基于C語言可以完成一個簡易的Web服務器,希望這篇文章會幫你你對C語言有更深入的理解

概述

C語言可以干大事,我們基于C語言可以完成一個簡易的Web服務器。當你能夠自行完成web服務器,你會對C語言有更深入的理解。對于網絡編程,字符串的使用,文件使用等等都會有很大的提高。

關于網絡的TCP協(xié)議在這里不在多說,大家可以查閱些資料。

工具

開發(fā)工具: CLion,編譯器

演示效果圖

創(chuàng)建socket對象

int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

???????if (0 > server_socket) {
    printf("[服務器] 創(chuàng)建socket對象失敗,服務器啟動失敗...\n");
    return -1;
}
printf("[服務器] 創(chuàng)建socket成功....\n");

綁定服務器端口

struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);


int bind_ret = bind(server_socket, (struct  sockaddr*) &my_addr, sizeof(my_addr));

if (0 > bind_ret) {
    printf("[服務器]綁定端口%d失敗,服務器啟動失敗\n", PORT);
    return -2;
}
printf("[服務器] 綁定端口:%d成功....\n", PORT);

監(jiān)聽服務器端口

int listen_ret = listen(server_socket, BACK_LOG);
if (0 > listen_ret) {
    printf("監(jiān)聽端口:%d失敗,服務器運行失敗....\n", PORT);
    return -3;
}
printf("[服務器] 監(jiān)聽端口:%d成功....\n", PORT);

建立連接

struct sockaddr_in accept_in;
socklen_t socklen = sizeof(accept_in);
int accept_socket = accept(server_socket, (struct sockaddr *) &accept_in, &socklen);

if (-1 == accept_socket) {
    printf("[服務器] 接收請求失敗,建立連接失敗... \n");
    return -4;
}
printf("[服務器] 建立連接成功....\n");

獲取客戶端請求

char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
ssize_t data = recv(accept_socket, buffer, sizeof(buffer), RECV_FLAG);


if (data == 0) {
    printf("[服務器] 超時或對端主動關閉...\n");
    break;
}
if (0 > data) {
    printf("[服務器] 接收數(shù)據失敗...\n");
    break;
}

printf("[服務器] 與客戶端建立連接成功...\n");

啟動服務器

[服務器] 創(chuàng)建socket成功....
[服務器] 綁定端口:9999成功....
[服務器] 監(jiān)聽端口:9999成功....
[服務器] 建立連接成功....
[服務器] 與客戶端建立連接成功...

解析前端(瀏覽器)發(fā)起的請求

tips: 本次只處理前端GET方式請,即標簽,或者從瀏覽器直接發(fā)起請求。

解析客戶端請求

此次項目獲取的頁面GET請求。

char req[100];
memset(req, 0, sizeof(req));

get_method_req(req_buffer, req);
url_decode(req);
printf("[服務器] 來自客戶端的請求==>%s\n", req);

定義字符數(shù)組存儲請求數(shù)據

char req[100];
memset(req, 0, sizeof(req));

將請求數(shù)據寫入req數(shù)組

void get_method_req(char *req_buff, char *req);
void get_method_req(char *req_buff, char *req) {
    int count = 0;
    for (int i = 6; i < strlen(buffer); i++) {
        if (buffer[i] == ' ') {
            break;
        }
        res[count++] = buffer[i];
    }
    res[count] = '\0';
}

將瀏覽器中的數(shù)據重新編碼

瀏覽器會對中文進行編碼,我們需要將其重新解碼回中文形式。

int hex2dec(char c);
void url_decode(char url[]);

int hex2dec(char c) {
    if ('0' <= c && c <= '9') {
        return c - '0';
    } else if ('a' <= c && c <= 'f') {
        return c - 'a' + 10;
    } else if ('A' <= c && c <= 'F') {
        return c - 'A' + 10;
    } else {
        return -1;
    }
}

void url_decode(char url[]) {
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    char res[100];
    for (i = 0; i < len; ++i) {
        char c = url[i];
        if (c != '%') {
            res[res_len++] = c;
        } else {
            char c1 = url[++i];
            char c0 = url[++i];
            int num = 0;
            num = hex2dec(c1) * 16 + hex2dec(c0);
            res[res_len++] = num;
        }
    }
    res[res_len] = '\0';
    strcpy(url, res);
}

運行結果

問題:如何關閉windows進程

如果在啟動web服務器時出現(xiàn)以下問題

查詢指定端口

netstat -aon | findstr 端口號

netstat -aon|findstr 9999

終止指定進程

taskkill /f /t /im 進程ID

taskkill /f /t /im 10200

到此這篇關于基于C語言編寫一個簡單的Web服務器的文章就介紹到這了,更多相關C語言編寫Web服務器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言container of()函數(shù)案例詳解

    C語言container of()函數(shù)案例詳解

    這篇文章主要介紹了C語言container of()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C++中vector與remove()函數(shù)詳解

    C++中vector與remove()函數(shù)詳解

    這篇文章主要介紹了C++中vector與remove()函數(shù),本文實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • c++中explicit與mutable關鍵字的深入探究

    c++中explicit與mutable關鍵字的深入探究

    這篇文章主要給大家介紹了關于c++中explicit與mutable關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C++ OpenGL實現(xiàn)三角形的繪制

    C++ OpenGL實現(xiàn)三角形的繪制

    這篇文章主要主要為大家詳細介紹了如何利用C++和OpenGL實現(xiàn)三角形的繪制,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-06-06
  • 詳解C++ 運算符重載中返回值的坑

    詳解C++ 運算符重載中返回值的坑

    這篇文章主要介紹了C++ 運算符重載中返回值的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 結構體類型數(shù)據作為函數(shù)參數(shù)(三種方法)

    結構體類型數(shù)據作為函數(shù)參數(shù)(三種方法)

    將一個結構體中變量中的數(shù)據傳遞給另一個函數(shù),有以下三種方法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++中幾種將整數(shù)轉換成二進制輸出的方法總結

    C++中幾種將整數(shù)轉換成二進制輸出的方法總結

    下面小編就為大家?guī)硪黄狢++中幾種將整數(shù)轉換成二進制輸出的方法總結。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 詳解C++設計模式編程中責任鏈模式的應用

    詳解C++設計模式編程中責任鏈模式的應用

    這篇文章主要介紹了C++設計模式編程中責任鏈模式的應用,責任鏈模式使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關系,需要的朋友可以參考下
    2016-03-03
  • Qt讀取Json文件的方法詳解(含源碼+注釋)

    Qt讀取Json文件的方法詳解(含源碼+注釋)

    QT本身就有讀取json的接口,簡單又方便,下面這篇文章主要給大家介紹了關于Qt讀取Json文件(含源碼+注釋)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • C++ namespace案例詳解

    C++ namespace案例詳解

    這篇文章主要介紹了C++ namespace案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08

最新評論

绥滨县| 九寨沟县| 西充县| 金沙县| 德昌县| 临安市| 肥东县| 同心县| 佛坪县| 达孜县| 宝兴县| 蒙城县| 平定县| 北流市| 青冈县| 黔西县| 英吉沙县| 武鸣县| 安图县| 巫溪县| 日土县| 社旗县| 桂阳县| 新津县| 涪陵区| 西贡区| 夹江县| 玉屏| 常熟市| 阜南县| 济阳县| 榆中县| 华池县| 开阳县| 天门市| 乐陵市| 荣成市| 北京市| 长阳| 闻喜县| 平安县|