Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Додатки



echoserv.c

#include <sys/socket.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <unistd.h>

 

#include "helper.h"

 

#include <stdlib.h>

#include <stdio.h>

 

#define ECHO_PORT (2002)

#define MAX_LINE (1000)

 

 

int main(int argc, char *argv[]) {

int list_s; /* listening socket */

int conn_s; /* connection socket */

short int port; /* port number */

struct sockaddr_in servaddr; /* socket address structure */

char buffer[MAX_LINE]; /* character buffer */

char *endptr; /* for strtol() */

int i = 0;

char b[MAX_LINE];

 

 

/* Get port number from the command line, and

set to default port if no arguments were supplied */

 

if ( argc == 2 ) {

port = strtol(argv[1], &endptr, 0);

if ( *endptr ) {

fprintf(stderr, "ECHOSERV: Invalid port number.\n");

exit(EXIT_FAILURE);

}

}

else if ( argc < 2 ) {

port = ECHO_PORT;

}

else {

fprintf(stderr, "ECHOSERV: Invalid arguments.\n");

exit(EXIT_FAILURE);

}

 

 

/* Create the listening socket */

 

if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {

fprintf(stderr, "ECHOSERV: Error creating listening socket.\n");

exit(EXIT_FAILURE);

}

 

 

/* Set all bytes in socket address structure to

zero, and fill in the relevant data members */

 

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(port);

 

 

/* Bind our socket addresss to the

listening socket, and call listen() */

 

if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {

fprintf(stderr, "ECHOSERV: Error calling bind()\n");

exit(EXIT_FAILURE);

}

 

if ( listen(list_s, LISTENQ) < 0 ) {

fprintf(stderr, "ECHOSERV: Error calling listen()\n");

exit(EXIT_FAILURE);

}

 

 

/* Enter an infinite loop to respond

to client requests and echo input */

 

 

if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {

fprintf(stderr, "ECHOSERV: Error calling accept()\n");

exit(EXIT_FAILURE);

}

 

 

while ( 1 )

{

 

Readline(conn_s, buffer, MAX_LINE-1);

 

if ( !strncmp(buffer, "bye", 3))

{

if ( close(conn_s) < 0 )

{

fprintf(stderr, "ECHOSERV: Error calling close()\n");

exit(EXIT_FAILURE);

}

if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {

fprintf(stderr, "ECHOSERV: Error calling accept()\n");

exit(EXIT_FAILURE);

}

}

else

{

for ( i=0; i<strlen(buffer); i++)

{

b[i]=buffer[strlen(buffer)-i-1];

}

b[strlen(buffer)] = 0;

for ( i=0; i<strlen(b); i++)

{

buffer[i]=b[i];

}

Writeline(conn_s, buffer, strlen(buffer));

}

 

}

}


helper.c

#include "helper.h"

#include <sys/socket.h>

#include <unistd.h>

#include <errno.h>

 

 

/* Read a line from a socket */

 

ssize_t Readline(int sockd, void *vptr, size_t maxlen) {

ssize_t n, rc;

char c, *buffer;

 

buffer = vptr;

 

for ( n = 1; n < maxlen; n++ ) {

 

if ( (rc = read(sockd, &c, 1)) == 1 ) {

*buffer++ = c;

if ( c == '\n' )

break;

}

else if ( rc == 0 ) {

if ( n == 1 )

return 0;

else

break;

}

else {

if ( errno == EINTR )

continue;

return -1;

}

}

 

*buffer = 0;

return n;

}

 

 

/* Write a line to a socket */

 

ssize_t Writeline(int sockd, const void *vptr, size_t n) {

size_t nleft;

ssize_t nwritten;

const char *buffer;

 

buffer = vptr;

nleft = n;

 

while ( nleft > 0 ) {

if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) {

if ( errno == EINTR )

nwritten = 0;

else

return -1;

}

nleft -= nwritten;

buffer += nwritten;

}

 

return n;

}

helper.h

#include <unistd.h> /* for ssize_t data type */

 

#define LISTENQ (1024) /* Backlog for listen() */

 

 

/* Function declarations */

 

ssize_t Readline(int fd, void *vptr, size_t maxlen);

ssize_t Writeline(int fc, const void *vptr, size_t maxlen);

 




Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.