Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пример tcp сервера, пришлите,пожалуста, пример tcp сервера 
:(
    Опции темы
admsasha
Дата 4.4.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Пришлите, пожалуста, пример tcp сервера, принимающий несколько подлючений...

по задачи нужно сделать что-то типа чата через сервер, т.е. должен быть сервер, которые принимает подлючения, получает данные и пересылает другому. smile
PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 6.4.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



слазь на FreeBSD Developer's Handbook
там есть про сокеты, и пример сериального сервера времени ( daytimed ).
тебе нужно посмотреть на блок схему параллельного сервера, и изменить оригинал соответственно.

кроме этого... есть МОРЕ свободного софта, с сырцами.
тот же ftp server - чем не потходит ? a ircd ? качай, отрезай ненужное и юзай.
Пока, Блин.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Chuck
Дата 6.4.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: 2
Всего: 9



Код

int main(int argc, char *argv[])
    {
    static int sockt;
    struct sockaddr_in serv_addr;
    static char *msg[1000];
    
    sockt = socket(AF_INET, SOCK_STREAM, 0);
    
  bzero(&serv_addr, sizeof(serv_addr));
  
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons (5000);
 
  if (bind(sockt, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0 ) 
    {
    printf("Bind error\n");
    return -1;
  }
  else { printf("BIND OK\n"); }
                                                                               
  if (listen(sockt, 5) < 0) {
    printf("listen error\n");
    return -1;
    }
    else { printf("LISTEN OK\n"); }
    
  static int connection;
  struct sockaddr_in client;
  int rc;
  int cllen = sizeof (client);
  do
  {
  connection = accept(sockt, (struct sockaddr*)&client, &cllen);
  if (connection > 0)
    {
    rc = read(connection, *msg, 1000);
    if (*msg == "ping")
        {
        rc = write(connection, "pong", 5);
        }
    } 
  } 
  while (connection > 0);  
}

Не отвечаю что работает, но принцип такой smile
А вот рабочий пример, вырезанный из учебника smile
Код

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define NSTRS       3           /* no. of strings  */
#define ADDRESS     "mysocket"  /* addr to connect */

/*
 * Strings we send to the client.
 */
char *strs[NSTRS] = {
    "This is the first string from the server.\n",
    "This is the second string from the server.\n",
    "This is the third string from the server.\n"
};

main()
{
    char c;
    FILE *fp;
    int fromlen;
    register int i, s, ns, len;
    struct sockaddr_un saun, fsaun;

    /*
     * Get a socket to work with.  This socket will
     * be in the UNIX domain, and will be a
     * stream socket.
     */
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("server: socket");
        exit(1);
    }

    /*
     * Create the address we will be binding to.
     */
    saun.sun_family = AF_UNIX;
    strcpy(saun.sun_path, ADDRESS);

    /*
     * Try to bind the address to the socket.  We
     * unlink the name first so that the bind won't
     * fail.
     *
     * The third argument indicates the "length" of
     * the structure, not just the length of the
     * socket name.
     */
    unlink(ADDRESS);
    len = sizeof(saun.sun_family) + strlen(saun.sun_path);

    if (bind(s, &saun, len) < 0) {
        perror("server: bind");
        exit(1);
    }

    /*
     * Listen on the socket.
     */
    if (listen(s, 5) < 0) {
        perror("server: listen");
        exit(1);
    }

    /*
     * Accept connections.  When we accept one, ns
     * will be connected to the client.  fsaun will
     * contain the address of the client.
     */
    if ((ns = accept(s, &fsaun, &fromlen)) < 0) {
        perror("server: accept");
        exit(1);
    }

    /*
     * We'll use stdio for reading the socket.
     */
    fp = fdopen(ns, "r");

    /*
     * First we send some strings to the client.
     */
    for (i = 0; i < NSTRS; i++)
        send(ns, strs[i], strlen(strs[i]), 0);

    /*
     * Then we read some strings from the client and
     * print them out.
     */
    for (i = 0; i < NSTRS; i++) {
        while ((c = fgetc(fp)) != EOF) {
            putchar(c);

            if (c == '\n')
                break;
        }
    }

    /*
     * We can simply use close() to terminate the
     * connection, since we're done with both sides.
     */
    close(s);

    exit(0);
}

Добавлено @ 19:41
Вот дока, где есть все описание, что тебе нужно
http://www.cs.cf.ac.uk/Dave/C/CE.html

А это ссылка на тот документ, откуда я тебе 2 пример вырезал
http://www.cs.cf.ac.uk/Dave/C/node28.html

Тоже очень полезная дока
http://www.geocities.com/kollurihari/hari/harilinks.html
PM MAIL WWW GTalk   Вверх
admsasha
Дата 7.4.2005, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



for: Chuck

первый код не рабочий... точнее только один раз приминает команду, а потом сервер встает.

второй код, не для моего случая, он создает локальный сокет, как я понял, а мне надо будет из вне подключаться... т.е. код не подходит.
PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 7.4.2005, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



Хотелось бы знать ... зачем тебе всё это нужно...
ведь не работает, собака....




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
admsasha
Дата 7.4.2005, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(bilbobagginz @ 7.4.2005, 15:41)
Хотелось бы знать ... зачем тебе всё это нужно...
ведь не работает, собака....

Делаю что-то типа чата через сервер...
PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 7.4.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



хмм.... ну ладно.
я имел в виду: если ты программишь, то тебе тут выдали все компоненты решения твоей задачи.
Ты не видишь ?

берёшь сайт который я тебе сослал по Фре. там есть схема "concurrent server",
рисуешь её, и реализуешь: т.е. ставишь loop под операцией "listen()".
и когда кто то подключился (accept() - удался ), создаёшь нувый процесс fork()
т.е.:
Код

....
while(1){

    if (  не удался.... accept(...) ){
          упс...
    }
    if (!(new_proc=fork())){
    /* папа! */
     /* чистим сокет, и продолжаем сервить */

    }else{
    /* сын! - за работу*/
             while(!time_to_die){
                    /*читаем, пишем, думаем: обрабатываем клиента*/

             }
              if ( time_to_kill_service ){
                     /* сигналим отцу отбрасывать коньки */
             }
             exit(0);
    }
}

пока.

Это сообщение отредактировал(а) bilbobagginz - 7.4.2005, 10:23


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
admsasha
Дата 8.4.2005, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Код

#define SRV_PORT 9205
#define BUF_SIZE 64
#define TXT_QUEST "Who are you?\n"

int main () {
    int s, s_new;
    int from_len;
    char buf[BUF_SIZE];
    struct sockaddr_in sin,from_sin;;

    s = socket (AF_INET, SOCK_STREAM, 0);
    memset ((char *)&sin, '\0', sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = SRV_PORT;
    bind (s, (struct sockaddr *)&sin, sizeof(sin));
    listen (s, 3);
    while (1) {
        from_len = sizeof(from_sin);
        s_new = accept (s, &from_sin,&from_len);
        write (s_new, TXT_QUEST, sizeof(TXT_QUEST));
        from_len = read (s_new, buf, BUF_SIZE);
        write (1, buf, from_len);
        shutdown (s_new, 0);
        close (s_new);
    };
}


не компилируется... что не так ?
код взят от сюда
Код

# g++ -Wall ./proba.c
proba.c: In function `int main()':
proba.c:35: cannot convert `sockaddr_in*' to `sockaddr*' for argument `2' to `int accept(int, sockaddr*, socklen_t*)'


PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 8.4.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Код

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>

int main()
{

    int sockfd, newsockfd; 
    int clilen;
    int n;
    char line[1000];
    char tmpstring[200];
    struct sockaddr_in servaddr, cliaddr;

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror(NULL);
        exit(1);
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family= AF_INET;
    servaddr.sin_port= htons(9205);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(sockfd, (struct sockaddr *) &servaddr, 
    sizeof(servaddr)) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    if(listen(sockfd, 5) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }

    while(1){
        clilen = sizeof(cliaddr);
        newsockfd = accept(sockfd,(struct sockaddr *) &cliaddr, &clilen);
       if (newsockfd <0){
            perror(NULL);
            close(sockfd);
            exit(1);

        }

        while((n = read(newsockfd, line, 999)) > 0){
            write(newsockfd, line,strlen(line));
        }
        close(newsockfd);
    }

    return 0;
}



Вот этот код работает даже у меня !!! smile

Это сообщение отредактировал(а) admsasha - 8.4.2005, 12:18
PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 3.6.2005, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



прошу удалить.... не туда пульнул....

Это сообщение отредактировал(а) admsasha - 3.6.2005, 08:50
PM MAIL WWW ICQ Jabber   Вверх
achmed
Дата 3.6.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 12.4.2004

Репутация: нет
Всего: нет



Есть библиотека CommonCpp2, в ней реализованы врапперы для сокетов
в стиле потоков стндартной библиотеки C++, есть базовый фреймворк
(если это так можно назвать) для разработкт сервера работающего с tcp
соединениями.

Если нет правильного представления о сокетах, то лучше сначало
потренироваться на голом API перед испольщованием оберток.

ЗЫ на сколько я помню там есть простой пример, представляющий из
себя что-то вроде чата.

Это сообщение отредактировал(а) achmed - 3.6.2005, 18:41
PM MAIL   Вверх
Guest
Дата 14.6.2005, 17:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile smile smile smile smile smile smile smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1070 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.