На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Oleg2004
  
    > Клиент - серверное приложение (TCP,UDP), Помогите, пожалуйста, переписать код приложения TCP клиент-сервер в UDP клиент - сервер
      Помогите, пожалуйста, переписать код приложения TCP клиент-сервер в UDP клиент - сервер...

      Клиент:
      ExpandedWrap disabled
        #include <iostream>
        #include <stdio.h>
        #include <cstdlib>
        #include <unistd.h>
        #include <stdarg.h>
        #include <string.h>
        #include <errno.h>
        #include <netdb.h>
        #include <sys/time.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <ctime>
        #include <fstream>
        #include <sys/syspage.h>
        #include <sys/neutrino.h>
         
        using namespace std;
         
        void error( const char *msg, int err = EOK ) {
            perror( msg );
            if( err != EOK ) errno = err;
            exit( EXIT_FAILURE );
        }
         double CyclesTomsec(uint64_t a)
        {
            uint64_t b=SYSPAGE_ENTRY(qtime)->cycles_per_sec;
            return a*1.0e6/(double) b;
        }
         
        int main(int argc,char **argv)
        {
            int i=0,mas[200], mas1[200];
            uint64_t t, t1=0;
            ifstream in("mas.txt");
            if(!in) cout<<"File not found\n", exit(EXIT_FAILURE);
            while(!in.eof()){
                in>>mas[i]; i++;
            }
            in.close();
         
            mas[i]=0xffff;
            int n=i+1;
            in_port_t listen_port = 9000;
            struct sockaddr_in peer;
            int s, rc;
            srand(time(NULL));
            char buf[20], echo[20];
            for(i=0; i<n;i++){
              memset( &peer, 0, sizeof(peer));
              peer.sin_len = sizeof(peer);
              peer.sin_family = AF_INET;
              peer.sin_port = htons(listen_port);
              inet_aton( "localhost", &peer.sin_addr );
         
            s=socket(AF_INET,SOCK_STREAM,0);
            if (s<0)
                error ("create stream socket failed");
            if  (connect(s,(struct sockaddr *) &peer,sizeof(peer)))
                  error("connect failed");
            sprintf(buf, "%d", mas[i]);
             t = ClockCycles();
            if( ( rc = write( s, buf, strlen(buf) + 1 )) <= 0 ) { perror( "write data failed" ); break; };
            rc = read( s, echo, 20 );
            t1+=ClockCycles()-t;
              if( rc < 0 ) { perror( "read data failed" ); break;};
              if( rc == 0 ) { std::cout << "server closed connection" << std::endl; break; };
              if( strcmp(buf, echo )== 0 ) { cout << "wrong data" << std::endl; break;};
              mas1[i]=atoi(echo);
            close( s );
           }
            
        cout << "Common time of connection - " <<CyclesTomsec(t1/n)<< " mcs"<<std::endl;
            ofstream out("mas1.txt");
            if(!out) cout<<"File not found\n", exit(EXIT_FAILURE);
            for(i=0;i<n-1;i++)
            {
                out<<mas1[i]<<"  ";
            }
            out.close();
            exit(EXIT_SUCCESS);
         }



      Сервер:
      ExpandedWrap disabled
        #include <iostream>
        #include <stdio.h>
        #include <cstdlib>
        #include <unistd.h>
        #include <stdarg.h>
        #include <string.h>
        #include <errno.h>
        #include <netdb.h>
        #include <sys/time.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
         
        using namespace std;
         
        void error( const char *msg, int err = EOK ) {
             perror( msg );
             if( err != EOK ) errno = err;
             exit( EXIT_FAILURE );
        }
         
        static int server(int s)
        {
            int rc, k,k1;
                char buf[20];
                rc = read( s, buf, 20 );
                k=atoi(buf);
                if( rc>0)
                    if(k!=0xffff){
                        k1=k^0xaa;
                        sprintf(buf, "%d", k1);
                        write( s, buf, strlen(buf) + 1 );
                    }
                return k;  
        }
         
         
         int main( int argc,  char **argv)
         {
            in_port_t listen_port = 9000;
            struct sockaddr_in peer;
            socklen_t peerlen;
            int s, s1, k;
            const int on = 1;
         
          s = socket(AF_INET,SOCK_STREAM,0);
          if (s<0)
                error ("create stream socket failed");
          if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))
            error("setsockopt failed");
            memset( &peer, 0, sizeof(peer));
            peer.sin_len = sizeof(peer);
            peer.sin_family = AF_INET;
            peer.sin_port = htons(listen_port);
            peer.sin_addr.s_addr=htonl(INADDR_ANY);
          if (bind(s,(struct sockaddr * ) &peer,sizeof(peer)))
            error("bind failed");
          if (listen(s, 25))
            error("listen failed");
          do
          {
            peerlen = sizeof (peer);
            s1= accept(s,(struct sockaddr *  )&peer, &peerlen);    
                if  (s1<0)
                error("accept failed");
            k=server(s1);
            close(s1);
        } while  (k!=0xffff);
         exit(EXIT_SUCCESS);
         }
      Сообщение отредактировано: KhNJu -
        На сервере надо сделать bind (у тебя уже сделано), а потом в цикле - select (вместо listen и accept) и recv.
        На клиенте - просто создать сокет с типом SOCK_DGRAM и делать sendto, на адрес сервера
          "Переписать" эти коды просто нельзя. :)
          Взаимодействие клиент/сервер по протоколу TCP абсолютно не похоже на взаимодействие их по UDP.
          Принцип совершенно иной.
          В клиенте нет connect(), передача и прием - совершенно другие функции.
          В сервере нет listen(),accept()и тд.
          Вот тут есть код и того и другого.
          Просто вставить свой порт.
          Сообщение отредактировано: Oleg2004 -
          GOD IS GOOD! IN ALL THE TIME!
            Спасибо!
              Здравствуйте Подскажите пожалуйста, с помощью каких компонентов лучше создать клиент серверное приложение ? Сервер будет на Windows, а клиент на Lubuntu? Спасибо

              user posted image
                Yу, что до меня, то я всегда на стороне WINAPI :)
                GOD IS GOOD! IN ALL THE TIME!
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,0981 ]   [ 18 queries used ]   [ Generated: 23.08.19, 09:30 GMT ]