導航:首頁 > 編程語言 > c編寫http伺服器寫日誌代碼

c編寫http伺服器寫日誌代碼

發布時間:2023-10-30 07:55:27

⑴ 如何用c語言實現http伺服器

//服務端簡易代碼如下:
#include<stdio.h>
#include<stdlib.h>

#include<err.h>
#include<event.h>
#include<evhttp.h>

voidhttp_handle(structevhttp_request*req,void*arg);/*HTTPRequestHandle*/

intmain(){
structevhttp*httpd;
event_init();
httpd=evhttp_start("0.0.0.0",2345);
if(httpd==NULL){
fprintf(stderr,"Error:Unabletolistenon%s:%d ");
exit(1);
}
evhttp_set_timeout(httpd,2000);
evhttp_set_gencb(httpd,http_handle,NULL);
event_dispatch();
evhttp_free(httpd);

return0;
}

voidhttp_handle(structevhttp_request*req,void*arg){
structevbuffer*buf;
buf=evbuffer_new();

/*Responsetheclient*/
evhttp_send_reply(req,HTTP_OK,"OK",buf);

//evbuffer_add_printf(buf,"%s","HTTPSQS_AUTH_FAILED");

/*Releasethememory*/
evbuffer_free(buf);
fprintf(stderr,"Send ");
}

編譯:編譯時把libevent的類庫中的.so文件和.h文件連接進來。

⑵ 如何用c寫獲取http post表單提交的數據

以下方法用CURL提交表單

1. 編譯環境.
安裝vs2010或其他版本. vs2010 express版也可以。不要低於vc6.

2. 搜索curl-7.25.0.zip,下載。
解壓到c:\curl-7.25.0

打開Visual Studio Command Prompt (2010)
cd \curl-7.25.0\winbuild
nmake /f Makefile.vc mode=dll USE_SSSPI=no ENABLE_IDN=no

編譯成功後 cd ..\builds
到一個名字為libcurl-....lib的子目錄里找到libcurl.dll和libcurl.lib, 保存到一個目錄下備份,下面要用。

3. 打開vc++ 2010, File->New project,選Win32 Project, 輸入一個項目名。下面點Next,勾上Console Application和Empty Project.

4. 配置項目
到我的文檔下找到vs2010 projects目錄,找到 solution名字\項目名字 目錄,
把curl-7.25.0目錄下的include目錄拷貝到項目目錄下
把2備份好的libcurl.dll和libcurl.lib拷貝到項目目錄.
在vc++中右鍵點擊項目名(或Alt+F7), 點開Configuration Properties, 點vc++directories
點Include Directories, 點Edit, 添加$(ProjectDir)include 確定
在點擊左側的Linker, 點Input,點Additional Dependences, 點Edit, 添加一行$(ProjectDir)\libcurl.lib 確定

5. 代碼。
右鍵點項目名字,Add New Item->C++ File, name寫main.c, 輸入代碼:
/* 抱歉,這里不好貼鏈接,版權沒法貼,版權去看http-post.c */
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>

int main(void)
{
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
/* First set the URL that is about to receive our POST. This URL can
just as well be a https:// URL if that is what should receive the
data. */
curl_easy_setopt(curl, CURLOPT_URL, "這里寫網址");
/* Now specify the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);

/* always cleanup */
curl_easy_cleanup(curl);
system("pause");
}
return 0;
}

點vc++綠色的三角編譯運行。

⑶ 用C語言編寫伺服器端和客戶機端的關鍵部分代碼!

atgc123的回答不錯,可以給一個價值5W微型項目用了。
我腦子里 有一套價值1000萬的C代碼,只有伺服器端的。
和atgc123不同的是
那段代碼可以:
1,並行處理5000個以上的連接;
2,設置非阻塞狀態;
3,實時監控連接狀態;
4,邏輯判斷數據包的合法性;
5,對於網速問題的容錯處理;
等等;
願意買嗎?

⑷ 設計一個linux c語言,Http協議的伺服器,用socket收發消息,簡單點,求代碼and注釋。

OK
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char *argv[])
{
int sockfd,new_socket;
int sock_value;
char buf[] = "hello! China!I Love You\n";

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 2){
fprintf(stderr,"The two number!\n");
exit(1);
}

if((sock_value = atoi(argv[1])) < 0){
fprintf(stderr,"socket error!\n");
exit(1);
}

if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}

bzero(&server_,SIZE);

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = INADDR_ANY;

if(bind(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("bind");
exit(1);
}

if(listen(sockfd, 12) == -1){
perror("listen");
exit(1);
}

printf("Waiting ... ...\n");

while(1){
if((new_socket = accept(sockfd,(struct sockaddr *)(&client_),&SIZE)) == -1){
perror("accept");
exit(1);
}

printf("The client IP is %s\n",inet_ntoa(client_.sin_addr));
printf("The socket is %d\n",ntohs(client_.sin_port));

if(write(new_socket,buf,strlen(buf)) == -1){
perror("write");
exit(1);
}

int my;
char mybuf[1024];

if((my = read(new_socket, mybuf,1024)) == -1){
perror("read");
exit(1);
}

mybuf[my] = '\0';
printf("#++++#++++#:%s\n",mybuf);

close(new_socket);

}

close(sockfd);

return 0;
}

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
int sockfd;
int sock_value;
char buf[1024];
char mybuf[] = "Linux\n";
int read_count;

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 3){
fprintf(stderr,"The two number!\n");
exit(1);
}

if((sock_value = atoi(argv[2])) < 0){
fprintf(stderr,"socket error!\n");
exit(1);
}

if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}

bzero(&client_,SIZE);
bzero(&server_,SIZE);

client_.sin_family = PF_INET;
client_.sin_port = htons(52252);
client_.sin_addr.s_addr = INADDR_ANY;

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = inet_addr(argv[1]);

if(connect(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("connect");
exit(1);
}

if((read_count = read(sockfd,buf,1024)) == -1){
perror("read");
exit(1);
}

buf[read_count] = '\0';
printf("#----#----#:%s\n",buf);

if(write(sockfd, mybuf,6) == -1){
perror("write");
exit(1);
}

close(sockfd);

exit(0);

return 0;
}

⑸ httpd服務自定義日誌文件、配置https訪問以及強制https跳轉

1、建立httpd服務,要求:
(1) 提供兩個基於名稱的虛擬主機:
www1.stuX.com ,頁面文件目錄為/web/vhosts/www1;錯誤日誌為/var/log/httpd/www1/error_log,訪問日誌為/var/log/httpd/www1/access_log;
www2.stuX.com ,頁面文件目錄為/web/vhosts/www2;錯誤日誌為/var/log/httpd/www2/error_log,訪問日誌為/var/log/httpd/www2/access_log;
(2) 通過 www1.stuX.com/server-status 輸出其狀態信息,且要求只允許提供賬號的用戶訪問;
(3) www1不允許192.168.0.88主機訪問;

2、為上面的第2個虛擬主機提供https服務,使得用戶可以通過https安全的訪問此web站點;
(1) 要求使用證書認證,證書中要求使用國家(CN),州(Beijing),城市(Beijing),組織為(MageE);
(2) 設置部門為Ops, 主機名為 www2.stuX.com ;

3、為https訪問配置強制跳轉,訪問 http://www2.stuX.com 會跳轉到 https://www2.stuX.com 上面去。

在進行配置前,首先安裝httpd服務及mod_ssl:

首先創建頁面文件目錄及日誌文件目錄:

隨後編輯配置配置文件:

之後配置用戶認證文件:

使用httpd -t檢查配置,如無報錯後啟動服務:

測試認證訪問:
我這邊用windows測試,本地Ip為192.168.0.38,修改保存C:\Windows\System32\drivers\etc\hosts文件:

然後測試訪問:

查看相應的日誌文件:

相關日誌log均能正常記錄訪問。

首先創建CA伺服器,用於簽發證書:

隨後生成簽發伺服器證書:

之後編輯/etc/httpd/conf.d/ssl.conf文件:

編輯/etc/httpd/conf.d/vhost.conf文件:

重啟httpd服務,後測試訪問:

此時訪問 http://www2.stuX.com 頁面,不會跳轉到https頁面訪問:

首先確認配置文件是否載入了mod_rewrite,httpd-2.4 mole配置文件在/etc/httpd/conf.moles.d/00-base.conf中:

隨後編輯www2的虛擬主機配置:

保存後重啟httpd服務,訪問相應的頁面測試:

此時訪問 www2.stuX.com 的其他路徑不會跳轉到https訪問頁面,如index.html。

Rewrite的模塊使用比較復雜,此處我也是剛接觸有興趣的同學可以參考下面的鏈接進行學習:
配置https服務: https://blog.csdn.net/wlzx120/article/details/52597338
配置https強制跳轉: https://www.centos.bz/2018/01/apache-%E5%BC%BA%E5%88%B6-http-%E5%85%A8%E9%83%A8%E8%B7%B3%E8%BD%AC%E5%88%B0-https/
Rewrite模塊: http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
Rewrite模塊中文手冊: http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html#rewriterule
RewriteRule和RewriteCond規則參數的詳細介紹: https://blog.csdn.net/lijunwyf/article/details/54948463

⑹ LINUX下C語言編程怎麼列印日誌

我們的程序一般都會產生輸出信息。但是伺服器程序一般卻不希望輸出信息到屏幕上,因為沒有人盯著你的程序執行。所以我們要把一些信息寫成日誌文件,正常情況下運行程序的人不用關心日誌里的內容,只有在出現問題的時候才會查看日誌文件里的內容以確定問題所在。
但如果我們的程序要自己生成一個文件來保存日誌卻不是好主意,因為這一方面增加了維護程序運行的人的負擔,另一方面自己維護起系統來也多有不便。
在Linux系統中有一個系統日誌,通常放在/var/log目錄下,比如文件名是syslog的,系統中的一些程序產生的日誌信息都會存放到這個文件里。日誌文件有固定的格式,比如第1列是消息產生的時間,第2列是機器名(因為日誌記錄程序支持遠程連接),第3列是標記信息(一般就是程序名稱)等。而且對應的有一些工具來對這個日誌進行維護,比如通過輪回機制保證日誌文件大小不會把磁碟空間占盡。所以我們把自己程序的信息也寫到這個系統日誌里是比較好的想法。
在GNU C語言庫提供的內容中,有介面可以用來做這件事。用下面的命令查看:

nm -D /lib/libc.so.6 | grep log

可以看到一些調用:

000b9410Tcloselog
0008b870Tgetlogin
0008b960Tgetlogin_r
000d0180T__getlogin_r_chk
000bd190Tklogctl
00027450T__open_catalog
000b9380Topenlog
0008bae0Tsetlogin
000b8b80Tsetlogmask
000b9350Tsyslog
000b9320T__syslog_chk
000b92f0Tvsyslog
000b8da0T__vsyslog_chk

這裡面的三個函數openlog, syslog, closelog是一套系統日誌寫入介面。另外那個vsyslog和syslog功能一樣,只是參數格式不同。
程序的用法示例代碼如下:

#include<syslog.h>
intmain(intargc,char**argv)
{
openlog("MyMsgMARK",LOG_CONS|LOG_PID,0);
syslog(LOG_DEBUG,
"'%s' ",
argv[0]);
closelog();
return0;
}

編譯生成可執行程序後,運行一次程序將向/var/log/syslog文件添加一行信息如下:

Feb1208:48:38localhostMyMsgMARK[7085]:'./a.out'

Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'

LOG_CONS
.

LOG_NDELAY
Opentheconnectionimmediately(normally,).

LOG_NOWAIT
Don』.(TheGNUClibrarydoesnotcreatea
childprocess,.)

LOG_ODELAY
TheconverseofLOG_NDELAY;()iscalled.(Thisisthedefault,andneed
notbespecified.)

LOG_PERROR
(NotinSUSv3.)Printtostderraswell.

LOG_PID
IncludePIDwitheachmessage.

第三個參數指明記錄日誌的程序的類型。

syslog函數及參數
syslog函數用於把日誌消息發給系統程序syslogd去記錄,此函數原型是:
void syslog(int priority, const char *format, ...);
第一個參數是消息的緊急級別,第二個參數是消息的格式,之後是格式對應的參數。就是printf函數一樣使用。

如果我們的程序要使用系統日誌功能,只需要在程序啟動時使用openlog函數來連接syslogd程序,後面隨時用syslog函數寫日誌就行了。

另外,作為syslog的替代程序的新一代工具是syslog-ng,syslog-ng具有很強的網路功能,可以方便地把多台機器上的日誌保存到一台中心日誌伺服器上。

⑺ C++實現http簡易代理伺服器

我正在做與你同樣的工作,我選擇了mongoose,一款開源的http伺服器。
http://code.google.com/p/mongoose/
這是它的網站,可以下載源碼,並且協議非常自由。

有不明白之處可以聯系我。我正在基於mongoose進行開發。

=========================================
源碼在這里可以下載到,http://code.google.com/p/mongoose/downloads/list
我也只是一個c程序員,不太會網路編程。但用mongoose的確非常簡單,因為就是c++寫的,你應該看起來不費勁。

閱讀全文

與c編寫http伺服器寫日誌代碼相關的資料

熱點內容
win10切換輸入語言 瀏覽:696
haier電視網路用不了怎麼辦 瀏覽:361
蘋果6手機id怎麼更改 瀏覽:179
米家掃地機器人下載什麼app 瀏覽:82
如何在編程貓代碼島20種樹 瀏覽:915
手機基礎信息存儲在哪個文件 瀏覽:726
如何查找手機備份文件 瀏覽:792
內存清理工具formac 瀏覽:323
iphone過濾騷擾電話 瀏覽:981
wap網路如何使用微信 瀏覽:699
手機迅雷應用盒子在哪個文件夾 瀏覽:351
windows8網路連接 瀏覽:442
怎麼快速增加qq群人數 瀏覽:919
錘子視頻播放器文件不存在 瀏覽:707
蘋果手機怎麼清理app緩存 瀏覽:682
花園戰爭2豪華升級包 瀏覽:517
電腦無法向u盤傳輸文件 瀏覽:823
bpn配置文件 瀏覽:932
501完美越獄工具 瀏覽:119
中間夾菜單裡面不能顯示壓縮文件 瀏覽:952

友情鏈接