
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тестовые примеры / ch11 / tli / tli_msg_srv
.C#include "tli.h"
#include <sys/times.h>
#include <sys/types.h>
#define MSG1 "Invalid cmd to message server"
typedef enum { LOCAL_TIME, GMT_TIME, QUIT_CMD, ILLEGAL_CMD } CMDS;
/* process a client's commands */
void process_cmd (tli* sp, int fd )
{
char buf[80];
time_t tim;
char* cptr;
int flags;
switch (fork()) {
case -1: perror("fork"); return;
case 0: break;
default: return; // parent
}
/* read commands from a client until EOF or QUIT_CMD */
while (sp->read(buf, sizeof buf, flags, fd) > 0)
{
cerr << "server: read cmd: '" << buf << "'\n";
int cmd = ILLEGAL_CMD;
(void)sscanf(buf,"%d",&cmd);
switch (cmd) {
case LOCAL_TIME:
tim = time(0);
cptr = ctime(&tim);
sp->write(cptr, strlen(cptr)+1, fd);
break;
case GMT_TIME:
tim = time(0);
cptr = asctime(gmtime(&tim));
sp->write(cptr, strlen(cptr)+1, fd);
break;
case QUIT_CMD:
sp->shutdown(fd);
exit(0);
default:
sp->write(MSG1, sizeof MSG1, fd);
}
}
exit(0);
}
int main( int argc, char* argv[])
{
char buf[80], socknm[80];
int port=-1, nsid, rc;
fd_set select_set;
struct timeval timeRec;
if (argc < 2) {
cerr << "usage: " << argv[0] << " <service|no> [<host>]\n";
return 1;
}
/* check if port no. of a socket name is specified */
(void)sscanf(argv[1],"%d",&port);
/* create a stream socket */
tli *sp;
if (port==-1)
sp = new tli( argv[2], argv[1] );
else sp = new tli (port);
if (!sp || !sp->good()) {
cerr << "server: create transport endpoint object fails\n";
return 1;
}
/* Bind a name to the server's transport end-point */
if (sp->Bind() < 0) {
cerr << "server: bind fails\n";
return 2;
}
for (struct t_call *call=0; sp->listen(call)==0; )
{
/* accept a connection request from a client socket */
if ((nsid = sp->accept(call)) < 0)
{
cerr << "server: accept fails\n";
return 3;
}
t_free((char*)call, T_CALL); // deallocate memory
cerr << "server: got one client connection. nsid=" << nsid << "\n";
/* create a child process to process commands */
process_cmd(sp,nsid);
close(nsid); /* re-cycle file descriptor */
}
sp->shutdown();
return 0;
}
Соседние файлы в папке tli