📄 server.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 + -