ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Помогите разобратся с сокет сервером на С++
  #1  
Старый 21.06.2009, 12:41
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию Помогите разобратся с сокет сервером на С++

Всем привет !

Написал сокет сервер на с++ незнаю правельно или нет - но так работает и запросы принемает , проблема в том что я не как не могу ответить клиенту через функцию send() ,

Код:
int main ( )
{
    int sockfd,client;
    sockfd = socket(PF_INET, SOCK_STREAM, 0);
    socklen_t n;


struct sockaddr_in addr;
bzero(&addr, sizeof(addr));

addr.sin_family = AF_INET;
addr.sin_port = htons(5190);
addr.sin_addr.s_addr = htonl(INADDR_ANY);



if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != -1){
            
       cout << "SERVER - STARTED !!!" <<"\n";
            while(1) {
                      if(!listen(sockfd, 5)){

                           n = sizeof(addr);
                           if((client = accept(sockfd, (struct sockaddr *) &addr, &n)) != -1){
                           cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";
                             
                             char c;
                             bool finished;
                             char buffer[1024];
                             finished = read(client, &c, 10);
                             cout << client << "---" << c <<"\n";

                             // вот сдесь и проблема не могу ответить клиенту !
                          int  hel;
                               hel = "9999\0";
                             send (client, hel, strlen(hel), 0);
                             close(client);
                             
                             }
                         }

            }
 
 
 }
 else{cout << "NO SERVER" << "\n";}


  
}
 
Ответить с цитированием

  #2  
Старый 21.06.2009, 14:08
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Во первых listen() запускается только один раз, во вторых внимательно пересмотри этот участок кода
Код:
                             char c;
                             bool finished;
                             char buffer[1024];
                             finished = read(client, &c, 10);
                             cout << client << "---" << c <<"\n";

                             // вот сдесь и проблема не могу ответить клиенту !
                          int  hel;
                               hel = "9999\0";
                             send (client, hel, strlen(hel), 0);
                             close(client);
Внимательно прочитай документацию по сетевым ф-циям!
 
Ответить с цитированием

  #3  
Старый 21.06.2009, 14:32
Аватар для --StraNger--
--StraNger--
Познающий
Регистрация: 04.01.2009
Сообщений: 94
Провел на форуме:
404716

Репутация: 145
Отправить сообщение для --StraNger-- с помощью ICQ
По умолчанию

стоит попробовать объявить переменную hel как char
 
Ответить с цитированием

  #4  
Старый 21.06.2009, 14:39
Аватар для slesh
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

close -> closesocket
read -> recv
hel - у тя int сделать хотябы char hel[размер]
strlen - тока для строк работает

у тебя наверное при компиле сотни варнингов на экран вылетают
 
Ответить с цитированием

  #5  
Старый 21.06.2009, 20:52
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Вобщем разобрался с отправкой ответа , скрипт немного переделал

Код:
int main ( )
{
    int sockfd,client;
        sockfd = socket(PF_INET, SOCK_STREAM, 0);
        socklen_t size;
 struct sockaddr_in addr;
 bzero(&addr, sizeof(addr));

        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = htonl(INADDR_ANY);

          // bind()
        if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
                cout << "Error - bind() !" << "\n"; 
                return 0;
                }
          // listen()
        if(listen(sockfd, 5) != 0){
                cout << "Error - listen() !" << "\n";
                return 0;
                }
                 
                
                while(1) {
                             size = sizeof(addr);
                             client = accept(sockfd, (struct sockaddr *) &addr, &size);

                             if(client > 0){

                                    cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";

                                    // - пришли данные
                               char buffer[1024];
                                    bzero(buffer,sizeof(buffer));
                                    recv(client, buffer, sizeof(buffer),0);
                                    cout << buffer << "\n";

                                    //- ответ клиенту
                               char *reply = "ggg";
                               send(client, reply, strlen(reply)+1, 0);

                             }
                }  
}
Получается к серверу конектятся клиенты и обмениваются данными - конект поддерживается постоянно с клиентом - и вот проблема как определить на стороне сервера что клиент

отключился - разорвал соеденение ?
 
Ответить с цитированием

  #6  
Старый 22.06.2009, 22:50
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Или подскажите куда капать - по поваду (как определить на стороне сервера что клиент отключился - разорвал соеденение ?)
 
Ответить с цитированием

  #7  
Старый 22.06.2009, 22:57
Аватар для --StraNger--
--StraNger--
Познающий
Регистрация: 04.01.2009
Сообщений: 94
Провел на форуме:
404716

Репутация: 145
Отправить сообщение для --StraNger-- с помощью ICQ
По умолчанию

Попробуй использовать WSAEventSelect
это события
 
Ответить с цитированием

  #8  
Старый 23.06.2009, 17:52
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Цитата:
Сообщение от --StraNger--  
Попробуй использовать WSAEventSelect
это события
Да что-то не получается с этим - на perl это все решается очень просто - на c++ еще не найду сдравого решения !
 
Ответить с цитированием

  #9  
Старый 30.06.2009, 12:10
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Вобщем написал сокет сервер - все работает только выдает 2 warning: при компиляции , я не могу их устранить

вот полный код сервера

Код:
#include <iostream.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#include <arpa/inet.h>



#define PORT  5190
#define SERVER_IP "000.000.00.000"


           




void NewClient (int client){


    while(1){

       char buffer[1024];
            bzero(buffer,sizeof(buffer));
            if(recv(client, buffer, sizeof(buffer),0) != 0){

                             cout << buffer "\n";      
                    
              }

       }

}





int main ( )
{
    int sockfd,client;
        sockfd = socket(PF_INET, SOCK_STREAM, 0);
        socklen_t size;
 struct sockaddr_in addr;
 bzero(&addr, sizeof(addr));

        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = htonl(INADDR_ANY);

          // bind()
        if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
                cout << "Error - bind() !" << "\n"; 
                return 0;
                }
          // listen()
        if(listen(sockfd, 5) != 0){
                cout << "Error - listen() !" << "\n";
                return 0;
                }
                 
                
                while(1) {
                             size = sizeof(addr);
                             client = accept(sockfd, (struct sockaddr *) &addr, &size);

                             if(client > 0){

                                             cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";

                                             char buffer[1024];
                                                  bzero(buffer,sizeof(buffer));
                                                  recv(client, buffer, sizeof(buffer),0);
                                               if(buffer == "<policy-file-request/>"){
                                                  char *mes = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
                                                  send(client, mes, strlen(mes)+1, 0);
                                                  close(client);
                                                  return 1;
                                                }

                                             if(!fork()){

                                                NewClient(client);

                                         }
     

                             }


                }


                  
}
а вот предупреждение при компиляции

In file included from /usr/include/c++/4.2/backward/iostream.h:31,
from server.cpp:1:
/usr/include/c++/4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
server.cpp: In function 'int main()':
server.cpp:107: warning: deprecated conversion from string constant to 'char*'

по <iostream.h> пытался так <iostream>
тогда вобще ошибок море все на cout указывают .

а 'char*' тоже незнаю как устранить !

Подскажите пожалуйста !
 
Ответить с цитированием

  #10  
Старый 30.06.2009, 14:29
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

При использовании <iostream> все обьекты библиотеки находятся в пространстве std, для этого необходимо либо в начале написать using namespace std; либо явно указывать пространство имен, например так std::cout

Далее эту запись замени
Код:
char *mes = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
на вот эту
Код:
char mes[] = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
П.С. в следующий раз пиши конкретно в какой строке ошибки/предупреждения, а то тут у тебя написано в 107, а кода меньше чем на 100 строк.

Последний раз редактировалось razb; 30.06.2009 в 14:37..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобратся с снифером для определения ip Berg25 PHP, PERL, MySQL, JavaScript 12 22.05.2009 01:41
помогите разобратся с xavior jacson70 E-Mail 2 27.09.2006 10:42
Помогите разобратся!!! Smerch Болталка 9 14.12.2004 00:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ