?? serversocket.cpp
字號:
#include "ServerSocket.h"
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
ServerSocket::ServerSocket(void)
{
try{
InitSocket();
}
catch (exception ex)
{
//something maybe done here
}
}
int ServerSocket::InitSocket()
{
if (Startup() == ERR) return ERR;
//Create Socket
m_ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( m_ServerSocket == INVALID_SOCKET )
{
throw "Create Socket Failed!";
}
m_serverAddr.sin_family = AF_INET;
m_serverAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
m_serverAddr.sin_port = htons(PORT);
memset(m_serverAddr.sin_zero, 0x00, 8);
//Bind Socket
if ( bind(m_ServerSocket, (struct sockaddr*)&m_serverAddr, sizeof(m_serverAddr)) != 0 ){
closesocket(m_ServerSocket);
throw "Bind Socket Failed!";
}
if ( listen(m_ServerSocket, 10) != 0 ){
closesocket(m_ServerSocket);
throw "listen Socket Failed!";
}
return 0;
}
void CloseSock(std::pair<std::string, SOCKET> info)
{
closesocket(info.second); //close the socket stored in a pair
}
ServerSocket::~ServerSocket(void)
{
closesocket(m_ServerSocket);
for_each(m_clientInfo.begin(), m_clientInfo.end(), CloseSock);
WSACleanup();
}
bool validateUser(string username, string password)
{
std::tr1::shared_ptr<FILE> fd = getfd("user.dat", "rb");
if (NULL == fd.get()) return false;
while (!feof(fd.get()))
{
User user;
if (1 != fread(&user, sizeof(User), 1, fd.get())) return false;
if (strcmp(user.username, username.c_str()) == 0 &&
strcmp(user.password, password.c_str()) == 0 )
{
return true;
}
}
return false;
}
int ServerSocket::Accept(SOCKET* socket)
{
struct sockaddr_in ClientAddr;
int ClientAddrLen = sizeof(ClientAddr);
*socket = accept(m_ServerSocket, (struct sockaddr*)&ClientAddr, &ClientAddrLen);
if ( *socket == INVALID_SOCKET )
{
throw "Accept Failed!";
}
//validate user;
char buff[MAX_PATH];
RecvBuff(*socket, buff);
string str = string(buff);
memset(buff, 0x00, MAX_PATH);
basic_string<char>::size_type i = str.find_first_of('\1');
if (!validateUser(str.substr(0, i) ,str.substr(i + 1)))
{
strcpy(buff, "0");
SendBuff(*socket, buff);
closesocket(*socket);
return ERR;
}
strcpy(buff, "1");
SendBuff(*socket, buff);
m_clientAddrList.push_back(ClientAddr);
m_clientInfo[str.substr(0, i)] = *socket;
return 0;
}
//if the user is not online, then send his or her task to
//a local file for this user on server and update the info of the user
//return value: 1 indicates the task is saved to the file while user info is not updated
// -1 indicates neither did the task is saved, nor did the user info is updated
// 0 indicates both are done successfully
int SaveToLocal(std::string username, std::string data)
{
//open the task file for the specific user
std::string taskfile = username + "_task.dat";
std::tr1::shared_ptr<FILE> fd = getfd(taskfile, "ab");
if (NULL == fd.get()) return -1;
Task task;
decode_task(data, task); // decode the task
//write the task to the file
if (1 != fwrite(&task, sizeof(Task), 1, fd.get())) return -1;
return 0;
}
//send data to specific user
//if the user is online send out immediately
//else save to corresponding local file
int ServerSocket::Send(std::string username, std::string data)
{
std::map<std::string, SOCKET>::iterator pos = m_clientInfo.find(username);
if (pos != m_clientInfo.end())
{
if( SendBuff(pos->second, data.c_str()) == ERR)
{
m_clientInfo.erase(pos);
return SaveToLocal(username, data);
}
else return 0;
}
else
{
return SaveToLocal(username, data);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -