URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3111
[ Назад ]

Исходное сообщение
"Помогите плиз новичку в с/с++ под линух (юникс)"

Отправлено netic , 30-Июн-04 15:50 
Вот хачу написать программку, суть такая:

Клиент/Серверное приложение в операционке Юникс. К нему конектистя клиент из вне (в данный момен я написал клиент на паскале в Дельфи, который конектится к серверу в юниксе и ему можно отправлять данные - текст)

В данном случае работает программа так:

1. Запускается ждет соединения
2. Как тока конектится клиент (Дельфевая прога) сразу говорит что приконектился клиент с таким то адресом
3. и все слушает его.
4. Клиент при нажатии на кнопку "Отправить" отправляет ему текст, код такой:
    cl это - TSockClient
    cl.Socket.SendText('startcon');
5. Сервак принимает и показывает текст.
6. после того как клиент отключается при помощи команды _exit(0) в процессах появляется [test <defunct>] где test название процесса (т.е. прогграммы (имя файла))

Вот код программы:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>

int main (int argc, char *argv[])
    {
    int sock, server;
    struct sockaddr_in addr, client;
    char buf[1024], outbuf[1024];
    int byte_read, li, claddrlen;

    claddrlen=sizeof(client);
    
    server=socket(AF_INET, SOCK_STREAM,0);        
    if (server<0) {printf("Error Create Sock\n"); exit(1);}
    
    printf("Socket created\n");
    
    addr.sin_family=AF_INET;
    addr.sin_port=htons(5124);
    addr.sin_addr.s_addr=htonl(INADDR_ANY);
    
    if (bind(server, (struct sockaddr*)&addr, sizeof(addr)) < 0)
    {printf("Error Bind\n");exit(1);}

    printf("Bind ok.\n");    

    listen(server, 20);

    while(1)
        {
        sock=accept(server, NULL, NULL);
    
        getpeername(sock,(struct sockaddr*)&client, &claddrlen);
        printf("Client %s connected\n", inet_ntoa(client.sin_addr));
        printf("Start reciving data....\n");
    
    switch(fork())
            {
        case -1:
        perror("fork");
        break;
        
        case 0:
        close(server);
        
        while (1)
            {
            byte_read=recv(sock, buf, 1024, 0);
            if (byte_read <=0 ) break;

            sprintf(outbuf, "%s: %s\n",inet_ntoa(client.sin_addr), buf);
            fputs(outbuf, stdout);
            
            send(sock, buf, byte_read, 0);
            }
            
        close(sock);
        printf("Client %s disconnected.\n", inet_ntoa(client.sin_addr));
        _exit(0);
                
        default:
        close(sock);
        break;    
        }    

    }
    
    return 0;
    }

Что хочется чтобы было в программе:

1. одновременное получение и отправки данных. т.е. чат 1 на 1..

вот и все. Пожалуйста гляньте чекаго. подскажите как сделать, если есть пример, подкиньте плиз. алгоритм хотябы дайте. Буду премного благодарен.
делал по инфе "Программирование сокетов в Линух" А. Шаргин


Содержание

Сообщения в этом обсуждении
"Помогите плиз новичку в с/с++ под линух (юникс)"
Отправлено foxru , 30-Июн-04 18:39 
>Вот хачу написать программку, суть такая:
....
>

по поводу 6 пункта
это означает что появился зомби, процесс который завершился но не было обработанно его завершение
http://www.opennet.me/base/dev/wait_zombie.txt.html
http://www.opennet.me/base/dev/chldfork.txt.html
после того как завершаеться процесс потомок которого ты создал fork'ом родительский процесс получает сигнал SIGCHLD
его тебе и надо обработать
на эту тему смотри wait
http://www.opennet.me/cgi-bin/opennet/man.cgi?topic=wait&cat...


"Помогите плиз новичку в с/с++ под линух (юникс)"
Отправлено netic , 30-Июн-04 19:59 
Спасибо! по пробую оптимизировать..