Доработать протокол отправки SMS-сообщений таким образом,
чтобы удалять можно было только разрешенные для удаления сообщения. Разрешения присваивает отправитель дополнительным параметром в команде sms.
Сервер:
PHP код:
#include "afx.h"
#include <iostream>
#include <winsock2.h>
#include <process.h> /* _beginthread, _endthread */
#include <string.h>
#include <time.h>
using namespace std;
CFile f;
CFileException ex;
clock_t start, finish;
// удалить сообщение с номером
void del(char* p,int n) {
char tel[200];
int j=0;
for (int i=n;p[i]!=' ';i++) {
tel[j]=p[i];
j++;
}
tel[j]='\0';
char fName[200];
CString strin;
fName[0]='\0';
strcat(fName,tel);
strcat(fName,".txt");
strin=fName;
CFile MyFile;
DeleteFile(strin);
cout<<"SMS is removed"<<endl;
}
//Отослать сообщение на SMS-центр для номера
void sms(char* p,int n) {
char tel[200];
char str[200]; int j=0;
CFile MyFile;
for (int i=n;p[i]!=' ';i++) {
tel[j]=p[i];
j++;
}
tel[j]='\0';
n=j+1;j=0;
for(int i=n/*-1*/;p[i];i++) {
str[j]=p[i];
j++;
}
str[j]='\0';
char fName[200];
CString strin;
fName[0]='\0';
strcat(fName,tel);
strcat(fName,".txt");
strin=fName;
cout<<"sms processing...";
if (!MyFile.Open(strin, CFile::modeWrite | CFile::modeCreate, &ex)){
cerr<<"SMS storage error. Try again\n";
exit(EXIT_FAILURE);
}
MyFile.Write(str,strlen(str));
cout<<"sent successfully"<<endl;
MyFile.Close();
}
void SMSworking(void* newS) {
int c;
char p[200], com[200];
com[0]='\0';p[0]='\0';
strcat(p,"SMS center connected...\n");
send((SOCKET)newS,p,sizeof(p),0);
while((c=recv((SOCKET)newS,p,sizeof(p),0)!=0)) {
int i=0;
while (p[i]!=' ') {
com[i]=p[i];
i++;
};
com[i]='\0';i++;
if (!strcmp(com,"sms")) {
start = clock();
sms(p,i);
com[0]='\0';
}
if (!strcmp(com,"del")) {
finish = clock();
// если с отправки сообщения прошло больше минуты
if((double)(finish - start) / CLOCKS_PER_SEC > 60 )
cout<<"Cannot be canceled"<<endl;
else
del(p,i);
com[0]='\0';
}
if (!strcmp(com,"quit")) {
closesocket((SOCKET)newS);
exit(EXIT_SUCCESS);
com[0]='\0';
}
}
}
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(1280);
local.sin_addr.s_addr = htonl(INADDR_ANY);
SOCKET s = socket(AF_INET, SOCK_STREAM,0);
int c=bind(s,(struct sockaddr*)&local,sizeof(local));
int r=listen(s,5);
while(true) {
sockaddr_in remote;
int j = sizeof(remote);
SOCKET newS = accept(s, (struct sockaddr*) &remote, &j);
_beginthread(SMSworking,0,(void*)newS);
}
WSACleanup();
return 0;
}
Клиент:
PHP код:
#include <winsock2.h>
#include <iostream>
using namespace std;
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
struct sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(1280);
peer.sin_addr.s_addr=inet_addr("127.0.0.1");
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
connect(s,(struct sockaddr*) &peer,sizeof(peer));
char b[200], buf[200];
recv(s,b,sizeof(b),0);
cout<<b;
b[0]='\0';
while (strcmp(b,"quit")) {
cin.getline(b,200,'\n');
send(s,b,sizeof(b),0);
}
WSACleanup();
return 0;
}
Скрины:
Сервер

Клиент

Блокнот