воскресенье, 22 ноября 2009 г.

nc -l -p {PORT}

Простой пример сервера-слушателя портов.

Задача: написать программу, которая запускала бы сервер и ждала подключение по заданному порту. Программа должна выводить принятые сообщения на экран. Отправка сообщение не требуется.

Задание:
Alternatiiv 9

Seekordse labori ülesanne on harjutada võrgust andmete vastuvõtmist. Sisuliselt tuleb implementeerida programm, mis töötab ajaloogselt programmiga "nc -l" — see tähendab, et trükib standardväljundisse kõik, mis programmile võrgust saadetakse. Standardsisendi saatmist implementeerida pole tarvis.

Ülesanne

Kirjutage programm 'mylistener', mis kuulab argumendiks antud pordil saabuvaid ühendusi. Ühenduse tekkimisel näidake kõik saadetu ekraanile.

Programm lõpetab töö, kui teine pool ühenduse sulgeb.

Näiteks kui tahate kuulata porti 8080:
mylistener 8080

Oma programmi testimiseks kasutage teisel konsoolil programmi netcat (nc):
nc localhost 8080

Seejärel võite kirjutada asju, mis peaksid teises konsoolis välja ilmuma. Netcati ühenduse sulgemiseks saate vajutada CTRL+C

Vihjeid

Kui soovite netcatiga midagi pordil 8080 kuulata, kirjutage:
nc -l -p 8080

Kasutage pordinumbreid, mis on suuremad kui 1024. Sellest allapoole jäävad süsteemile reserveeritud pordid.

Seekord prototüüpi pole — kirjutage ka makefile tuginedes varasemale kogemusele.

Esitamine

Saatke kiri pealkirjaga "itv0020 alt9", milles on teie matriklinumber ja midagi, mis spämmifiltrile usutava tekstina tunduks.

Решение:
#include 
#include 
#include  
#include 
#include 
#include 
#include 

#define MAX_MSG_LEN 255

void error(char *msg)
    {
    perror(msg);
    exit(1);
    }

int main(int argc, char *argv[])
    {
    int sock, newsock, c, n, i;
    char receive_message[MAX_MSG_LEN];
    socklen_t clilen; 
    struct sockaddr_in server, client;

    if (argc < 2)
        {
        fprintf(stderr,"\nError. No port provided. Use '%s 8888' for example.\n\n", argv[0]);
        exit(1);
        }

    sock = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock < 0) error("Error on opening socket.");

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

    server.sin_family      = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);    
    server.sin_port        = htons(atoi(argv[1]));

    if (bind(sock, (struct sockaddr *) &server, sizeof(server)) < 0) error("Error on binding.");

    listen(sock, 1);

    while(1)
        {
        clilen = sizeof(client);

        newsock = accept(sock, (struct sockaddr *) &client, &clilen);

        if (newsock < 0)  error("ERROR on accept");
        else
            {
            while(1)
                {
                memset(receive_message,0,MAX_MSG_LEN);
                n = recv(newsock, receive_message, MAX_MSG_LEN, 0);
                if(n == 0)
                    {
                    shutdown(newsock, 2);
                    exit(EXIT_SUCCESS);
                    }
                printf("%s", receive_message);
                }
            }
        }
    exit(EXIT_SUCCESS);
    }

Будь первым комментатором.

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