網(wǎng)絡(luò)駭客入門之TCP并發(fā)網(wǎng)頁服務(wù)器-創(chuàng)新互聯(lián)

網(wǎng)絡(luò)駭客入門之TCP并發(fā)網(wǎng)頁服務(wù)器

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的平遠網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

TCP并發(fā)服務(wù)器本來準備寫在網(wǎng)絡(luò)駭客入門之TCP編程后面的,但是因為代碼有點長,所以就單獨寫了一篇

注意:

因為瀏覽器發(fā)送的數(shù)據(jù)比較多,所以作為本服務(wù)器的接受緩沖區(qū)recv_buf要大點,至少512字節(jié),建議1024字節(jié)

如果接收不全的話,無論如何都不能將網(wǎng)頁傳給瀏覽器,這個bug卡了我一晚上,所以記得特別清楚。

創(chuàng)建線程時傳給線程的參數(shù)注意寫連接套接字的值,先轉(zhuǎn)換為(void*)類型,

pthread_create(&pth,NULL,msg_echo,(void *)connfd);

再在線程里轉(zhuǎn)回(int)型

int connfd = (int)arg;

不能寫地址,防止如果同時有多個請求時connfd的值變得太快,在子線程取地址取出來之前值就變了

1.頭文件

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <stdlib.h>

#include <arpa/inet.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <pthread.h>

#include <fcntl.h>

//子線程處理瀏覽器的網(wǎng)頁請求

void *msg_echo(void *arg)

{

int connfd = (int)arg;

int ret_read=0;

int ret_recv=0;

char recv_buf[1024]="";

char read_buf[1024]="";

char send_buf[1024]="";

int fd;

char filename[50] = "html/";

//請求成功返回

char head[]="HTTP/1.1 200 OK\r\n" \

"Content-Type: text/html\r\n" \

"\r\n";

//請求失敗返回

char err[]= "HTTP/1.1 404 Not Found\r\n" \

"Content-Type: text/html\r\n" \

"\r\n" \

"<HTML><BODY>File not found</BODY></HTML>";

printf("connfd=%d\n",connfd);

//接收請求數(shù)據(jù)

ret_recv = recv(connfd,recv_buf,sizeof(recv_buf),0);

printf("ret_recv:%d\n",ret_recv);

//讀取網(wǎng)頁文件名

sscanf(recv_buf+4, "%[^ ]", (filename + 5));

printf("filename:%s\n",filename);

//打開網(wǎng)頁文件

fd = open(filename, O_RDONLY);

if(fd < 0)

{       

perror("open");

send(connfd, err, strlen(err), 0);

close(connfd);

return NULL;

}

//將網(wǎng)頁文件發(fā)給瀏覽器

send(connfd,head,strlen(head),0);

while((ret_read = read(fd,read_buf,sizeof(read_buf)))>0)

{

// printf("%s\n",read_buf);

send(connfd,read_buf,ret_read,0);

}

close(connfd);

close(fd);

}

2.main函數(shù)

int main(int argc, char *argv[])

{

unsigned int port=8000;//設(shè)置端口

if(argc > 1)//可指定端口

{

port = atoi(argv[1]);

}

int sockfd;

struct sockaddr_in my_addr;

// 結(jié)構(gòu)體

memset(&my_addr,0,sizeof(my_addr));

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(port);

my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

// 套接字

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if(sockfd < 0)

{

perror("socket");

exit(-1);

}

//綁定端口

int err = bind(sockfd,(struct sockaddr*)&my_addr,sizeof(my_addr));

if(err != 0)

{

perror("bind");

close(sockfd);

exit(-1);

}

//監(jiān)聽端口

err = listen(sockfd,10);

if(err != 0)

{

perror("listen");

close(sockfd);

exit(-1);

}

printf("listen at %d\n",port);

//多線程處理連接請求

while(1)

{

int connfd;//連接套接字

struct sockaddr_in client_addr;

char cli_ip[INET_ADDRSTRLEN]="";

socklen_t cliaddr_len = sizeof(client_addr);

//接受請求

connfd = accept(sockfd,(struct sockaddr *)&client_addr,&cliaddr_len);

if(connfd < 0)

{

perror("accept");

}

//輸出連接者信息

inet_ntop(AF_INET,&client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);

printf("accepted--ip:%s  port:%d\n",cli_ip,ntohs(client_addr.sin_port));

//創(chuàng)建線程

pthread_t pth;

pthread_create(&pth,NULL,msg_echo,(void *)connfd);

pthread_detach(pth);

}

close(sockfd);

return 0;

}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前標題:網(wǎng)絡(luò)駭客入門之TCP并發(fā)網(wǎng)頁服務(wù)器-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://bm7419.com/article40/ddjgho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)、微信公眾號、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司