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

C/C++ 實(shí)現(xiàn)簡易HTTP服務(wù)器的示例

 更新時(shí)間:2020年10月19日 09:57:44   作者:lyshark  
這篇文章主要介紹了C/C++ 實(shí)現(xiàn)簡易HTTP服務(wù)器的示例,幫助大家更好的理解和學(xué)習(xí)C/C++編程,感興趣的朋友可以了解下
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 2048
#define BUF_SMALL 100

void Send_404(SOCKET sock)
{
	char Protocol[] = "HTTP/1.0 404 Bad Request\r\n";
	send(sock, Protocol, strlen(Protocol),0);
	closesocket(sock);
}

void SendData(SOCKET sock, char *filename)
{
	char Protocol[] = "HTTP/1.1 200 OK\r\n";
	char ServerType[] = "Server:MyWebServer\r\n";
	char ContentLen[] = "Content-length:2048\r\n";
	char ContentType[] = "Content-type:text/html\r\n";
	char buffer[BUF_SIZE] = {0};
	FILE *fp;
	if ((fp = fopen(filename, "r")) != NULL)
	{
		// 傳輸頭數(shù)據(jù)
		send(sock, Protocol, strlen(Protocol), 0);
		send(sock, ServerType, strlen(ServerType), 0);
		send(sock, ContentLen, strlen(ContentLen), 0);
		send(sock, ContentType, strlen(ContentType), 0);

		// 傳輸數(shù)據(jù)
		while (fgets(buffer, BUF_SIZE, fp) != NULL)
			send(sock, buffer, strlen(buffer), 0);
		closesocket(sock);
	}
}

unsigned WINAPI RequestHandle(void *argv)
{
	SOCKET hClntSock = (SOCKET)argv;

	char Buffer[BUF_SIZE] = { 0 };
	char Method[BUF_SMALL] = { 0 };
	char FileName[BUF_SMALL] = { 0 };

	recv(hClntSock, Buffer, BUF_SIZE, 0);

	// 尋找HTTP請求頭 如果不為空則繼續(xù)
	if (strstr(Buffer, "HTTP/1") != NULL)
	{
		// 接著判斷是否為GET請求方式
		strcpy(Method, strtok(Buffer, "/"));
		if (strcmp(Method, "GET") != 0)
		{
			strcpy(FileName, strtok(0, "/"));
			printf("請求方式: %s 請求文件: %s \n", Method,FileName);
			SendData(hClntSock, FileName);
			closesocket(hClntSock);
			return 0;
		}
	}

	Send_404(hClntSock);
	closesocket(hClntSock);
	return -1;
}

int main(int argc,char * argv[])
{
	WSADATA wsaData;
	SOCKET ServerSock, ClientSock;
	SOCKADDR_IN ServerAddr, ClientAddr;

	WSAStartup(MAKEWORD(2, 2), &wsaData);
	ServerSock = socket(PF_INET, SOCK_STREAM, 0);
	memset(&ServerAddr, 0, sizeof(ServerAddr));

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	ServerAddr.sin_port = htons(80);

	bind(ServerSock, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
	listen(ServerSock, 10);

	while (1)
	{
		HANDLE hThread;
		DWORD dwThreadID;
		int ClientAddrSize;

		ClientAddrSize = sizeof(ClientAddr);
		ClientSock = accept(ServerSock, (SOCKADDR *)&ClientAddr, &ClientAddrSize);

		printf("請求客戶端 IP: %s --> 端口: %d \n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
		hThread = (HANDLE)_beginthreadex(0, 0, RequestHandle, (void *)ClientSock, 0, (unsigned *)&dwThreadID);
	}
	closesocket(ServerSock);
	WSACleanup();
	return 0;
}

以上就是C/C++ 實(shí)現(xiàn)簡易HTTP服務(wù)器的示例的詳細(xì)內(nèi)容,更多關(guān)于C/C++ 實(shí)現(xiàn)簡易HTTP服務(wù)器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中臨時(shí)對象的常見產(chǎn)生情況及其解決的方案

    C++中臨時(shí)對象的常見產(chǎn)生情況及其解決的方案

    這篇文章主要是探討常見的臨時(shí)對象產(chǎn)生的情況,及其如何避免和解決這種臨時(shí)對象產(chǎn)生的方式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼

    C++語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 一文詳解Qt如何讀取和寫入配置文件的數(shù)據(jù)

    一文詳解Qt如何讀取和寫入配置文件的數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了在Qt中如何實(shí)現(xiàn)讀取和寫入配置文件的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 詳解C++中string的用法和例子

    詳解C++中string的用法和例子

    string是C++標(biāo)準(zhǔn)庫的一個重要的部分,主要用于字符串處理。這篇文章主要介紹了C++ string的用法和例子,需要的朋友可以參考下
    2018-05-05
  • C語言中如何判斷質(zhì)數(shù)

    C語言中如何判斷質(zhì)數(shù)

    這篇文章主要介紹了C語言中的判斷質(zhì)數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C++缺省參數(shù)與重載函數(shù)(超詳細(xì)!)

    C++缺省參數(shù)與重載函數(shù)(超詳細(xì)!)

    無論使用什么語言函數(shù)都是代碼段中必不可少的部分,因此我們有必要深入認(rèn)識一下C++中函數(shù)的兩種特殊用法,缺省參數(shù),函數(shù)重載,這篇文章主要給大家介紹了關(guān)于C++缺省參數(shù)與重載函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • C++?std::copy與memcpy區(qū)別小結(jié)

    C++?std::copy與memcpy區(qū)別小結(jié)

    本文主要介紹了C++?std::copy與memcpy區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 基于QT5實(shí)現(xiàn)一個時(shí)鐘桌面

    基于QT5實(shí)現(xiàn)一個時(shí)鐘桌面

    這篇文章主要介紹了利用QT5實(shí)現(xiàn)的一個時(shí)鐘桌面,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下
    2022-01-01
  • 詳解C語言初階基礎(chǔ)

    詳解C語言初階基礎(chǔ)

    這篇文章主要介紹了C語言中的初階基礎(chǔ),介紹了其相關(guān)概念,具有一定參考價(jià)值。需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-11-11
  • C++中TinyXML讀取xml文件用法詳解

    C++中TinyXML讀取xml文件用法詳解

    本文主要介紹了C++中TinyXML讀取xml文件用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

油尖旺区| 丹江口市| 宁安市| 扎赉特旗| 高碑店市| 朝阳县| 健康| 那坡县| 玛曲县| 海丰县| 慈溪市| 丰宁| 会同县| 商都县| 衡山县| 丁青县| 沭阳县| 达尔| 阿巴嘎旗| 潜江市| 海晏县| 渝中区| 杭锦旗| 舒兰市| 沛县| 公主岭市| 高州市| 道孚县| 老河口市| 内乡县| 桦甸市| 麟游县| 遂平县| 阳原县| 辉县市| 廊坊市| 丰宁| 南乐县| 洛南县| 绍兴市| 明光市|