C++ 小词典[STL+Socket] (CS版)

    技术2025-02-18  11

    服务端:dictServer.cpp

    #include <iostream> #include <fstream> #include <string> #include <map> #include <set> #include <winsock2.h> #include "dictCom.h" using namespace std; BOOL loadFile(set<string> &myset, const string &myfile); BOOL loadFile(map<string,string> &mymap, const string &myfile); BOOL queryWordFast(const set<string> &myset, const string &myword); BOOL addWord(set<string> &myset,map<string,string> &mymap,const string &myfile, const pair<string,string> & mywordexp); BOOL delWord(set<string> &myset,map<string,string> &mymap,const string &myfile, const string &myword); BOOL queryWord(const string &myfile,map<string,string> &mymap,const string & myword,string &myexp); BOOL modifyWord(const string& myfile,map<string,string> & mymap, const pair<string,string> & mywordexp); BOOL addWordSafe(set<string> &myset,map<string,string> &mymap, const pair<string,string> & mywordexp); BOOL delWordSafe(set<string> &myset,map<string,string> &mymap, const string &myword); BOOL queryWordSafe(const map<string,string> &mymap, const string & myword,string &myexp); BOOL modifyWordSafe(map<string,string> & mymap, const pair<string,string> & mywordexp); BOOL saveFile(const map<string,string> &mymap, const string &myfile); BOOL ServerMode(const set<string> &myset , map<string,string> &mymap,const string &myfile); BOOL printList(const set<string> & myset); short int workMode = -1 ; string filename ,myword , myexp ; map<string , string> mymap ; set<string> myset ; char CMD ='/0'; /*==================================main =====================================*/ int main(int argc, char *argv[]){ if(argc == 1){//safe mode workMode = 1 ; cout << "SAFE MODE !!!" << endl; Sleep(4000); goto MENU ; } filename = string(argv[1]) ; if(!loadFile(myset , filename)) { cerr << "Can't load file! " << endl; return 1 ; } MENU: system("cls"); cout << "1.add a new word 2.delete a word" << endl; cout << "3.query a word 4.modify a word" << endl; if(workMode == -1) cout << "5.Server mode 6.Print words list" << endl; else if(workMode == 1) cout << "5.Save to file 6.Print words list" << endl; cout<< "7.quit"<< endl; cout <<"Input your cmd:" << endl; cin.clear(); cin.sync(); cin>>CMD; switch(CMD){ case '1': cout<< "word <Enter> explanation <Enter>:" << endl; cin.clear(); cin.sync(); cin>> myword ; if(queryWordFast(myset,myword)){ cout << "Word '" << myword <<"' has been added!" <<endl ; break ; } cin.clear(); cin.sync(); getline(cin,myexp); if(workMode == -1){ if(!addWord(myset,mymap,filename,make_pair(myword,myexp))){ cerr <<"Can't add word!" << endl ; break ; } }else if(workMode == 1){ if(!addWordSafe(myset,mymap,make_pair(myword,myexp))){ cerr <<"Can't add word!" << endl ; break ; } } cout << "Add word '"<< myword <<"' successfully !" <<endl ; break ; case '2': cout << "word <Enter>:" <<endl; cin.clear(); cin.sync(); cin>> myword; if(!queryWordFast(myset,myword)){ cout << "Word '" << myword <<"' doesn't exists !" <<endl ; break ; } if(workMode ==-1){ if(!delWord(myset,mymap,filename,myword)){ cerr <<"Can't delete word!" << endl ; break ; } }else if(workMode == 1){ if(!delWordSafe(myset,mymap,myword)){ cerr <<"Can't delete word!" << endl ; break ; } } cout << "Delete word '"<< myword <<"' successfully !" <<endl ; break ; case '3': cout << "word <Enter>:" <<endl; cin.clear(); cin.sync(); cin>> myword; if(!queryWordFast(myset,myword)){ cout << "Word '" << myword <<"' doesn't exists !" <<endl ; break ; } if(workMode ==-1){ if(!queryWord(filename,mymap,myword,myexp)){ cerr <<"Not found !" << endl ; break ; } }else if(workMode == 1){ if(!queryWordSafe(mymap,myword,myexp)){ cerr <<"Not found !" << endl ; break ; } } cout << "Explanation:" << endl << myexp <<endl ; break ; case '4': cout<< "word <Enter> explanation <Enter>:" << endl; cin.clear(); cin.sync(); cin>> myword ; if(!queryWordFast(myset,myword)){ cout << "Word '" << myword <<"' doesn't exists !" <<endl ; break ; } cin.clear(); cin.sync(); getline(cin,myexp); if(workMode ==-1){ if(!modifyWord(filename,mymap,make_pair(myword,myexp))){ cerr <<"Can't modify word!" << endl ; break ; } }else if(workMode == 1){ if(!modifyWordSafe(mymap,make_pair(myword,myexp))){ cerr <<"Can't modify word!" << endl ; break ; } } cout << "Modify word '"<< myword <<"' successfully !" <<endl ; break ; case '5': if(workMode ==-1){ ServerMode(myset,mymap,filename); break ; }else if(workMode == 1){ cout<< "Input the filename you would like to save as :" << endl; cin.clear(); cin.sync(); cin>>filename; if(!saveFile(mymap,filename)){ cerr <<"Can't save to file !" << endl ; break ; } cout << "Save to '" <<filename << "' Ok!" << endl ; } break ; case '6': printList(myset);break; case '7': exit(EXIT_SUCCESS);break; } if(workMode == 0 ) if(!mymap.empty()) mymap.clear(); system("pause"); goto MENU; return 0 ; } /*==================================main end===================================*/ BOOL loadFile(set<string> &myset, const string &myfile){ ifstream in_file; string curStr,myline; in_file.open(myfile.c_str()); if(!in_file){ return false; } while(getline(in_file , myline)){ curStr = string(myline.begin()+1,myline.end()); if(myline.at(0) == '$' ) if(myset.count(curStr) == 0) myset.insert(curStr); } in_file.close(); in_file.clear(); return true; } BOOL loadFile(map<string,string> &mymap, const string &myfile){ ifstream in_file ; string word , exp , myline; BOOL ifOk = false ; in_file.open(myfile.c_str()); if(!in_file) return false; while(getline(in_file , myline)){ if(myline.size()<2) continue; if((myline.at(0) == '$')){ word = string(myline.begin()+1,myline.end()) ; ifOk = false ; continue ; } if(myline.at(0) == '%' ){ exp = string(myline.begin()+1,myline.end()) ; mymap.insert(make_pair(word,exp)) ; ifOk = true ; continue; } } in_file.close(); in_file.clear(); return ifOk; } BOOL queryWordFast(const set<string> &myset, const string &myword){ return (myset.count(myword) > 0); } BOOL addWord(set<string> &myset,map<string,string> &mymap,const string &myfile, const pair<string,string> & mywordexp){ if(!loadFile(mymap,myfile)) return false ; if(!addWordSafe(myset,mymap,mywordexp)) return false ; if(!saveFile(mymap,myfile)) return false ; mymap.clear(); return true ; } BOOL delWord(set<string> &myset,map<string,string> &mymap,const string &myfile, const string &myword){ if(!loadFile(mymap,myfile)) return false ; if(!delWordSafe(myset,mymap,myword)) return false ; if(!saveFile(mymap,myfile)) return false ; mymap.clear(); return true ; } BOOL queryWord(const string &myfile,map<string,string> &mymap,const string & myword,string &myexp){ if(!loadFile(mymap,myfile)) return false ; if(!queryWordSafe(mymap,myword,myexp)) return false ; if(!saveFile(mymap,myfile)) return false ; mymap.clear(); return true ; } BOOL modifyWord(const string& myfile,map<string,string> & mymap, const pair<string,string> & mywordexp){ if(!loadFile(mymap,myfile)) return false ; if(!modifyWordSafe(mymap,mywordexp)) return false ; if(!saveFile(mymap,myfile)) return false ; mymap.clear(); return true ; } BOOL addWordSafe(set<string> &myset,map<string,string> &mymap, const pair<string,string> & mywordexp){ size_t count1 = myset.count(mywordexp.first),count2 = mymap.count(mywordexp.first); if(count2 != 0) return false ; if(count1 != 0) return false ; myset.insert(mywordexp.first); mymap.insert(mywordexp); return true ; } BOOL delWordSafe(set<string> &myset,map<string,string> &mymap, const string &myword){ size_t count1 = myset.count(myword),count2 = mymap.count(myword); if(count2 == 0) return false ; if(count1 == 0) return false ; myset.erase(myword); mymap.erase(myword); return true ; } BOOL queryWordSafe(const map<string,string> &mymap, const string & myword,string &myexp){ size_t count = mymap.count(myword); if(count == 0) return false ; myexp = (mymap.find(myword))->second; return true ; } BOOL modifyWordSafe(map<string,string> & mymap, const pair<string,string> & mywordexp){ size_t count = mymap.count(mywordexp.first); if(count == 0) return false ; mymap.find(mywordexp.first)->second = mywordexp.second ; return true ; } BOOL saveFile(const map<string,string> &mymap, const string &myfile){ ofstream out_file ; BOOL ifOk = false ; out_file.open(myfile.c_str()); if(!out_file) return false; for(map<string,string>::const_iterator iter1 = mymap.begin();iter1!= mymap.end(); ++ iter1){ out_file << "$" << iter1->first << endl; out_file << "%" << iter1->second<< endl; ifOk = true ; } out_file.close(); out_file.clear(); return ifOk; } BOOL ServerMode(const set<string> &myset , map<string,string> &mymap,const string &myfile){ WSADATA wsaData; WSAStartup(0x0202,&wsaData); SOCKET serverSocket ,clientSocket; SOCKADDR_IN serverAddr,clientAddr ; TCHAR buffer[BUFFER_SIZE]; string word , exp ; int addrSize = sizeof(SOCKADDR_IN); ZeroMemory(buffer,sizeof(buffer)); serverSocket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr =inet_addr(IPTRAVELER); serverAddr.sin_port = htons(IPTRAVELER_PORT); while(serverSocket != INVALID_SOCKET && serverSocket!= SOCKET_ERROR ){ bind(serverSocket,(LPSOCKADDR)&serverAddr,sizeof(serverAddr)); listen(serverSocket,1); clientSocket = accept(serverSocket,(struct sockaddr *)&clientAddr,&addrSize); if(clientSocket == INVALID_SOCKET) return false ; cout <<"["<< inet_ntoa(clientAddr.sin_addr)<<":" << ntohs(clientAddr.sin_port)<< "]" <<" has connected server !" << endl; send(clientSocket,"220 Online dictionary Server!",40,0); while(clientSocket != INVALID_SOCKET && clientSocket!= SOCKET_ERROR){ recv(clientSocket,buffer,sizeof(buffer),0); word = string(buffer); if(queryWordFast(myset,word)) queryWord(myfile,mymap,word,exp) ; else exp = "Not found!"; if(clientSocket == INVALID_SOCKET || clientSocket== SOCKET_ERROR) break ; if(word.at(0)=='#') break; send(clientSocket,exp.c_str(),exp.size(),0); exp.clear(); word.clear(); ZeroMemory(buffer,sizeof(buffer)); } exp.clear(); word.clear(); ZeroMemory(buffer,sizeof(buffer)); ZeroMemory(&clientAddr,sizeof(clientAddr)); cout<<"Client closed!"<<endl; } closesocket(serverSocket); WSACleanup(); return true; } BOOL printList(const set<string> & myset){ if(myset.empty()) return false; for(set<string>::const_iterator iter1 = myset.begin();iter1!=myset.end();++iter1){ cout<<*iter1<< endl; } return true; }

     

    客户端:dictClient.cpp

    #include <winsock2.h> #include <iostream> #include <string> #include "dictCom.h" using namespace std; int main(int argc,char *argv[]){ WSADATA wsaData; SOCKET conn; SOCKADDR_IN connAddr; TCHAR buffer1[BUFFER_SIZE]; string buffer2; /*=================start up of the network===========================*/ connAddr.sin_family=AF_INET; connAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]); connAddr.sin_port = htons(IPTRAVELER_PORT); WSAStartup(MAKEWORD(2,0),&wsaData); conn = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); if(connect(conn,(SOCKADDR *)&connAddr,sizeof(connAddr)) == INVALID_SOCKET){ return 0; } /*===================ends start up of the network====================*/ cout<< "Notice:"<<endl << "To ask for words explanations ,you may write them on" << endl << "the screen and then press <Enter> key ." << endl << "Once there are some new words appear on the screen," << endl << "they are answers the server sends you back , and you" << endl << "may ask for more words' explanations once you saw them."<< endl << endl ; while(true){ ZeroMemory(buffer1,sizeof(buffer1)); recv(conn,buffer1,sizeof(buffer1),0); cout << buffer1 << endl; cin.clear(); cin.sync(); cin>> buffer2; send(conn,buffer2.c_str(),buffer2.size(),0); if(buffer2.at(0)=='#') break; } closesocket(conn); WSACleanup(); return 0; }

    共用文件:dictCom.h

    #ifndef DICT_H #define DICT_H #define IPTRAVELER "127.0.0.1" /*Server IP */ #define IPTRAVELER_PORT 5150 /*Server TCP Port */ #define BUFFER_SIZE 1024 /*size of buffer*/ #endif

    说明:

     本程序在C-Free 5 下调试通过,使用Socket时同时只能有一个客户端连接。客户端只能进行查询,不能修改数据

     服务器端运行方式:dictServer.exe filename ,filename为词典数据文件,如不加参数运行则启动安全模式

     安全模式下只有保存文件操作才会影响到原有数据文件

     为避免不必要的运行时错误,请不要手动建立词典文件<可先启用安全模式添加记录保存到文件,退出后重新进入系统>

     客户端运行方式:dictClient.exe hostAddress ,hostAddress 为服务器主机地址

     C-Free 5 下连接库设置如图

    词典数据文件示例:dictionary.dict

    $a %art. 一;任一;每一 $age %n. 年龄;时代;阶段;寿命,使用年限vi. 变老;成熟vt. 使变老,使上年纪;使成熟 $apple %n. 苹果;[俚]家伙 $apply %vt. 应用;申请;涂,敷

    最新回复(0)