суббота, 2 января 2010 г.

Linux класс сокетов.

Недавно себе для удобства написал небольшой класс, легко и быстро реализующий tcp сокет. Возможно кому-то (например мне) пригодиться, поэтому вывешиваю тут.
#include iostream //тут не хватает кавычек, подставьте сами и тд
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include stdlib.h

using namespace std;

class Server {
public:
Server(int port, int waiters) {
listener = socket(AF_INET, SOCK_STREAM, 0);
if( listener <>
cout<<"SERVER Error creating socket"<
exit(0);
} else {
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
if( bind(listener, (struct sockaddr *)&addr, sizeof(addr) ) <>
cout<<"SERVER Error binding port"<
exit(0);
} else {
listen(listener, waiters);
}
}
}
~Server() {
close(listener);
close(user);
}
bool Accept() {
user = accept(listener, NULL, NULL);
if( user <>
return true;
}
string Read() {
string socket_data;
do {
bytes_read = recv(user, buff, 5000, 0);
} while( bytes_read <= 0 );
socket_data=buff;
return socket_data;
}
void CloseUser() {
close(user);
}
void CloseListener() {
close(listener);
}
void Send(string send_data) {
send(user, send_data.c_str(), send_data.size(), 0);
}
void operator >>(string* line) {
*line=Read();
}
void operator <<(string* line) {
Send(*line);
}
private:
int listener;
int user;
int bytes_read;
char buff[5000];
struct sockaddr_in addr;
};

Пример эхо сервера (с много поточностью через fork() с порождением независимых дочерних процессов):
int main() {
Server MainServer(30000, 5);
while( true ) {
if( !MainServer.Accept() ) {
cout<<"Error accepting"<
exit(0);
}
if( fork() == 0 ) {
MainServer.CloseListener();
string data;
MainServer>>&data;
cout<<
MainServer<<&data;
MainServer.CloseUser();
_exit(0);
} else {
MainServer.CloseUser();
}
}
MainServer.CloseListener();
return 0;
}

Комментариев нет:

Отправить комментарий

Постоянные читатели