?? dictserver.cpp
字號(hào):
/*************************************************************************
文件名稱:dictServer.cpp
項(xiàng)目名稱:遠(yuǎn)程字典服務(wù)(RemoteLookup) TCP
創(chuàng)建者:胡峰令
創(chuàng)建時(shí)間:2005-4-19
最后修改時(shí)間:2005-5-16
功能: 根據(jù)接收到的單詞將相應(yīng)意思發(fā)給客戶端
文件中的函數(shù)名稱和簡(jiǎn)單功能描述:
void DoNewWord(BufferSocket s);//讀入需要查詢的單詞并返回相應(yīng)結(jié)果給客戶端
void DoWord(char* word,int num);//拆分單詞和其意思并將其插入到Hash表中合適的位置
int MakeDict(char *filename,int& num);//將字典讀入內(nèi)存
int SearchWordByHash(char *word,int num);//查詢單詞
int GetValueByWord(char *word,int num);//將給定字符串轉(zhuǎn)換成相應(yīng)數(shù)字
*************************************************************************/
#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);//讀入需要查詢的單詞并返回相應(yīng)結(jié)果給客戶端
void DoWord(char* word,int num);//拆分單詞和其意思并將其插入到Hash表中合適的位置
int MakeDict(char *filename,int& num);//將字典讀入內(nèi)存
int SearchWordByHash(char *word,int num);//查詢單詞
int GetValueByWord(char *word,int num);//將給定字符串轉(zhuǎn)換成相應(yīng)數(shù)字
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;
}
//建立服務(wù)器端socket
if((serverSocket=socket(AF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
{
printf("Create socket error\n");
WSACleanup();
return 0;
}
//填充服務(wù)器端SOCKADDR_IN結(jié)構(gòu)
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
serverAddr.sin_port=htons(USER_PORT);
//將服務(wù)器端socket與指定IP地址和端口綁定
if(bind(serverSocket,(SOCKADDR *)&serverAddr,sizeof(serverAddr))==SOCKET_ERROR)
{
int temp;
temp=WSAGetLastError();
printf("Bind error!\n");
closesocket(serverSocket);
WSACleanup();
return 0;
}
//指定服務(wù)器端serverSocket為監(jiān)聽(tīng)模式
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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -