⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 一个简易dns 服务器
💻 CPP
字号:
// server.cpp : 定义控制台应用程序的入口点。
//

// Server.cpp : Defines the entry point for the console application.
//
// 1. open the *.c in the Visual C++, then "rebuild all".
// 2. click "yes" to create a project workspace.
// 3. You need to -add the library 'ws2_32.lib' to your project 
//    (Project -> Properties -> Linker -> Input -> Additional Dependencies) 
// 4. recompile the source.

#include "stdafx.h"
#include "dns.h"
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include  <iostream>
#include <time.h>
using   namespace   std; 
#pragma   comment   (lib,"WS2_32.lib")   
//#define DEFAULT_PORT	8080
#define  INITIAL_ARRAY_MAX 50

#define SOCKET_LISTEN_BACKLOG 100//最大连接数 
DWORD WINAPI ServerThread(LPVOID pParam);//函数声明,没有用类 
DWORD WINAPI SessionThread(LPVOID pParam); 
SOCKET*  list[100];
int n;
int wordCount = 0;
char **wordArray;  
char *w;
//int _tmain(int argc, _TCHAR* argv[]) 
int _tmain(int argc, char **argv) 
{ 
;  
    int capacity = INITIAL_ARRAY_MAX;
   
int nRetCode = 0; 
int nTCP_Port ; //服务器端口号
if (argc == 2)
nTCP_Port = atoi(argv[1]);
else{
	printf("-----------------------------------------\n");
printf("Please input the listen port(number only):  ");
 
	scanf("%d",&nTCP_Port);
}
 printf("-----------------------------------------\n");


LPVOID pParam=NULL; //传递给线程的参数 

pParam = &nTCP_Port; 

DWORD dwThreadId; 
HANDLE hThread = CreateThread(NULL, 0, ServerThread, pParam, 0, &dwThreadId); 


while(_getch()!=27); 



return nRetCode; 
} 

DWORD WINAPI ServerThread(LPVOID pParam) 
{ 
char **wordArray;


    int capacity = INITIAL_ARRAY_MAX;
    int wordCount = 0;
	
	time_t now;
char ft[WORD_LENGTH];
int ftflag=0;
char  FliterMessage[WORD_LENGTH]="Connet Successful\n";//rubbish message
//取得参数 
int nRetCode; 
int nTCP_Port; 

nTCP_Port= *((int*)pParam); 
n=1;
//调用WSAStartup初始化WINSOCK API. 
WSADATA wsaData; 
WORD wVersionRequested = MAKEWORD( 2, 1 );//WINSOCK版本2.1 
nRetCode = WSAStartup(wVersionRequested, &wsaData); 
printf("WSAStartup FINISHED\n");
if(nRetCode!=0) //init failure 
{ 
return nRetCode; 
} 

cout << "Starting up TCP server\r\n"; 
cout << "Waiting the connection in port" << ' '; 
cout << nTCP_Port <<  ' '; 
cout << "..........." << endl; 
cout << "----------------------------------" << endl; 
cout << "You can press 'ESC' to terminate program" << endl;
cout << "----------------------------------" << endl;




SOCKET server; 
server=socket(AF_INET,SOCK_STREAM,0); 
if(server==INVALID_SOCKET) //create socket failure 
{ 
return 0; 
} 

sockaddr_in local;//绑定到服务器的网卡和端口
local.sin_family=AF_INET; //Address family 
local.sin_addr.s_addr=INADDR_ANY; //Wild card IP address 
local.sin_port=htons(nTCP_Port); //port to use 
if(bind(server,(sockaddr*)&local,sizeof(local))!=0) 
{ 
return 0; 
} 

if(listen(server,SOCKET_LISTEN_BACKLOG)!=0)//监听TCP端口 
{ 
return 0; 
} 

while(true)//一直循环 
{ 
SOCKET * pSessionSocket; 
sockaddr_in from; 
int fromlen=sizeof(from); 

//accept()等待连接,程序在此等待 
pSessionSocket = new SOCKET(); 
*pSessionSocket=accept(server, (struct sockaddr*)&from, &fromlen); 

//save the every socket data to list
list[n]=pSessionSocket;
n++;

//为每个连接开一个新线程,把Socket传递给新线程 



DWORD dwThreadId; 
HANDLE hThread = CreateThread(NULL, 0, SessionThread, (LPVOID)pSessionSocket, 0, &dwThreadId); 








//在服务器端console输出客户的ip。 

cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\r\n"; 
w = inet_ntoa(from.sin_addr) ;




} 



//关闭服务器的socket 
closesocket(server); 

//清除winsock API调用。有文档称可以不再调用,为保持兼容建议保留 
WSACleanup(); 

return 0; 
} 

DWORD WINAPI SessionThread(LPVOID pParam)//与客户交互的线程 
{ 
SOCKET * pSessionSocket;//取得socket 
pSessionSocket = (SOCKET*)pParam; 


//接受客户端发送的信息

   
    time_t now;
	
    char szBuff[200];
	char szBuff2[200];
	int msg_len;
	int addr_len;
	char *dns_result="(not found)!\n"; //定义返回信息参数







	while(true)
	{

		


memset(szBuff, 0,sizeof(szBuff));
msg_len = recv(*pSessionSocket, szBuff, sizeof(szBuff), 0);

	int i=1;
while(i<n)
	{ 
		
			send(*list[i], szBuff, sizeof(szBuff), 0);
			i++;}

	
		


	}
 
	

	 

//在线程里关闭对话,释放资源 
closesocket(*pSessionSocket); 
delete pSessionSocket; 

return 0; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -