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

📄 dictserver.cpp

📁 通过在远端主机上搭建一个远程字典服务服务器
💻 CPP
字号:

/*************************************************************************
文件名称:dictServer.cpp
项目名称:远程字典服务(RemoteLookup) TCP
创建者:胡峰令
创建时间:2005-4-19
最后修改时间:2005-5-16
功能: 根据接收到的单词将相应意思发给客户端
文件中的函数名称和简单功能描述:
void DoNewWord(BufferSocket s);//读入需要查询的单词并返回相应结果给客户端
void DoWord(char* word,int num);//拆分单词和其意思并将其插入到Hash表中合适的位置
int MakeDict(char *filename,int& num);//将字典读入内存
int SearchWordByHash(char *word,int num);//查询单词
int GetValueByWord(char *word,int num);//将给定字符串转换成相应数字
*************************************************************************/


#include "sock_common.h"
#include <time.h>

#include <process.h>
#include <conio.h>

#define USER_PORT 5150
#define BUFFER_SIZE 100
#define DICTSIZE 8000
#define WORDLEN 100

struct Dword
{
	char data[WORDLEN];
	char mean[WORDLEN];
};

Dword dictionary[DICTSIZE];
int DictNum;
//ReadBuffer readbuf;

unsigned __stdcall HttpThread(void *  p);
unsigned long hThreadHandle;
unsigned uThreadID;

void DoNewWord(BufferSocket s);//读入需要查询的单词并返回相应结果给客户端
void DoWord(char* word,int num);//拆分单词和其意思并将其插入到Hash表中合适的位置
int MakeDict(char *filename,int& num);//将字典读入内存
int SearchWordByHash(char *word,int num);//查询单词
int GetValueByWord(char *word,int num);//将给定字符串转换成相应数字


int main()
{
	WSADATA wsaData;
	SOCKET serverSocket,newConnection;
	SOCKADDR_IN serverAddr,clientAddr;
	
	int Ret,clientAddrLen;

	//初始化Winsock Dll
	if((Ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)
	{
		printf("WSAStartup failed with error %d\n", Ret);
		return 0;
	}

	//建立服务器端socket
	if((serverSocket=socket(AF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
	{
		printf("Create socket error\n");
		WSACleanup();
		return 0;
	}

	//填充服务器端SOCKADDR_IN结构
	serverAddr.sin_family=AF_INET;
	serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
	serverAddr.sin_port=htons(USER_PORT);
    
	//将服务器端socket与指定IP地址和端口绑定
	if(bind(serverSocket,(SOCKADDR *)&serverAddr,sizeof(serverAddr))==SOCKET_ERROR)
	{
		int temp;
		temp=WSAGetLastError();
		printf("Bind error!\n");
		closesocket(serverSocket);
		WSACleanup();
		return 0;
	}

	//指定服务器端serverSocket为监听模式
	if(listen(serverSocket,5)!=0)
	{
		printf("Listen error!\n");
		closesocket(serverSocket);
		WSACleanup();
		return 0;
	}

	printf("begin to server!\n");
	clientAddrLen=sizeof(clientAddr);
	//MakeDict("新东方红宝书.txt",DictNum);
	while(!kbhit())
	{
		if((newConnection=accept(serverSocket,(sockaddr FAR*)&clientAddr,&clientAddrLen))==INVALID_SOCKET)
		{
			printf("Connect failed.Please try again!\n");
			continue;
		}
		hThreadHandle = _beginthreadex(NULL , 0 , HttpThread , (void *)&newConnection , 0 , &uThreadID);
		CloseHandle((HANDLE) hThreadHandle);
	}
	closesocket(serverSocket);
	WSACleanup();
	return 0;
}

unsigned __stdcall HttpThread(void *  p)
{
	BufferSocket BufSock;
	InitBufferSocket(&BufSock);
	BufSock.Socket = *((SOCKET *) p);
	DoNewWord(BufSock);
	closesocket(BufSock.Socket);
	return 0;
}

void DoNewWord(BufferSocket BufSock)
{
	char buf[BUFFER_SIZE],*NotFind="Sorry,We can't find the word in the dictionary!";
	int Ret;
	Ret = ReadLineFromBufferSocket(&BufSock , buf , WORDLEN);
	buf[Ret-2]='\0';

	//int index=SearchWordByHash(buf,DictNum);

	/*if(index!=-1)
	{
		if((Ret=WriteSocket(BufSock.Socket,dictionary[index].mean,strlen(dictionary[index].mean))) < 0 )
			printf("Send failed.You can try again!\n");
	}*/
	//else
	switch( *buf )
	{
	    case 's':
		{
			if((Ret=WriteSocket(BufSock.Socket,NotFind,strlen(NotFind))) < 0 )
				printf("Send failed.You can try again!\n");
			break;
		}
		default:
			break;
	}
	return;
}


void DoWord(char* word,int num)
{
	int i,f=0,k1=0,k2=0;
	char ctemp[WORDLEN];

	for(i=0;i<int(strlen(word));i++)
	{
		if(word[i]!=' ')
			ctemp[i]=word[i];
		else
			break;
	}
	ctemp[i]='\0';

	if(!strcmp(ctemp,"fool’serrand"))
	    i=1;

	int tn=GetValueByWord(ctemp,num);

	if(dictionary[tn].data[0]!='0')
		for(tn=0;tn<num;tn++)
			if(dictionary[tn].data[0]=='0')
				break;
    f=0;
	for(i=0;i<int(strlen(word));i++)
	{
		if(word[i]!=' '&&f==0)
		{
			dictionary[tn].data[k1]=word[i];
			k1++;
		}
		if(word[i]!=' '&&f==1)
		{
			dictionary[tn].mean[k2]=word[i];
			k2++;
		}
		if(word[i]==' '&&word[i+1]!=' ')
			f=1;
	}
	dictionary[tn].data[k1]='\0';
	dictionary[tn].mean[k2]='\0';

}

int MakeDict(char *filename,int& num)
{
	char tword[WORDLEN];
	num=0;
	FILE *fp;
	memset(dictionary,'0',sizeof(dictionary));
	if((fp=fopen(filename,"r"))==NULL)
	{
		printf("Open the dictionary failed\n");
		return 0;
	}
	else
	{
		while(fgets(tword,WORDLEN,fp)!=NULL)
			num++;
		rewind(fp);
		while(fgets(tword,WORDLEN,fp)!=NULL)
			DoWord(tword,num);
	}
	fclose(fp);
	return 1;
}

int SearchWordByHash(char *word,int num)
{
	int temp;
	temp=GetValueByWord(word,num);
	if(!strcmp(dictionary[temp].data,word))
		return temp;
	else
	{
		for(temp=0;temp<DictNum;temp++)
			if(!strcmp(dictionary[temp].data,word))
				return temp;
	}
	return -1;
}

int GetValueByWord(char* word,int num)
{
	int i,Ret=0,step=1;
	for(i = strlen(word) - 1 ; i >= 0 ; i--)
	{
		if(word[i] - 'a' < 0)
			continue;
		Ret += (word[i] - 'a') * step;
		step += 10;
		Ret = Ret % num;
	}
	return Ret;
}

⌨️ 快捷键说明

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