ФорумПрограммированиеБольше языковC/C++ и C# → C++. Клиент-сервер - завершение преложений после создания соединения

C++. Клиент-сервер - завершение преложений после создания соединения

  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 9 ноября 2009 г. 23:00

    Мб кто подскажет почему мои клиент сервер не обмениваются сообщениями и выключаются при запуске одного из них несмотря на cin.get() - Ожидание ввода
    клиент
    #include <stdio.h>
    #include <iostream>
    #include <winsock2.h>
    int main(){

    WSADATA WsaData;
    struct sockaddr_in peer;
    int s;
    int s1;
    int rc;
    char buf[1];
    int err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
    printf ("WSAStartup() failed: %ld\n", GetLastError ());
    return 1;
    }
    peer.sin_family = AF_INET;
    peer.sin_port = htons(7500);
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s<0){
    perror("socket error");
    exit(1);
    }else
    std::cout<<"Create sock: OK\n";

    rc = connect(s,(struct sockaddr*)&peer, sizeof(peer));
    if (rc){
    perror("connect error");
    exit(1);
    }else
    std::cout<<"Connected: OK\n";

    rc= send(s1,"2",1,0);
    if (rc<=0){
    perror("send error");
    exit(0);
    }else
    std::cout<<"Send: OK\n";
    rc = recv(s1,buf,1,0);
    if (rc<=0){
    perror("read error");
    exit(1);
    }else
    std::cout<<"Read: OK\n";

    printf("%c\n",buf[0]);
    std::cin.get();
    return 0;
    }

    сервер
    #include <stdio.h>
    #include <iostream>
    #include <winsock2.h>
    int main(){

    WSADATA WsaData;
    struct sockaddr_in local;
    int s;
    int s1;
    int rc;
    char buf[1];
    int err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
    printf ("WSAStartup() failed: %ld\n", GetLastError ());
    return 1;
    }
    local.sin_family = AF_INET;
    local.sin_port = htons(7500);
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s<0){
    perror("socket error");
    exit(1);
    }else
    std::cout<<"Create sock: OK\n";
    rc = bind(s,(struct sockaddr*)&local, sizeof(local));
    if (rc<0){
    perror("bind error");
    exit(1);
    }else
    std::cout<<"Bind: OK\n";
    rc = listen(s,5);
    if(rc){
    perror("listen error");
    exit(1);
    }else
    std::cout<<"Listen: OK\n";
    s1 = accept(s,NULL,NULL);
    if (s1<0){
    perror("accept error");
    exit(1);
    }else
    std::cout<<"Accept: OK\n";
    rc = recv(s1,buf,1,0);
    if (rc<=0){
    perror("read error");
    exit(1);
    }else
    std::cout<<"Read: OK\n";
    printf("%c\n",buf[0]);
    rc= send(s1,"2",1,0);
    if (rc<=0){
    perror("send");
    exit(0);
    }else
    std::cout<<"Send: OK\n";
    std::cin.get();
    return 0;
    }

  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 10 ноября 2009 г. 1:32, спустя 2 часа 32 минуты

    попробуй два раза подряд, написать cin.get(),
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 10 ноября 2009 г. 1:51, спустя 18 минут 47 секунд

    std::cin.get();

    зы я не ззнаю с++ но мне кажется что это пиздеж какой то)
    Сапожник без сапог
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 10 ноября 2009 г. 2:00, спустя 9 минут 38 секунд

    phpdude, не. проверял. эта штука ждёт клавиши ентер.

    попробуй два раза подряд, написать cin.get(),

    не, не работает. но я кажись расковырял. позже надеюсь выложу эхо сервер с клиентом
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 10 ноября 2009 г. 2:12, спустя 11 минут 57 секунд

    Mr.Pihto, ну ждать то ждет, а что дальше? :)
    Сапожник без сапог
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 10 ноября 2009 г. 2:39, спустя 26 минут 9 секунд

    ну вот оно у мну не ждало. а ведь доллжно было
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 10 ноября 2009 г. 2:47, спустя 8 минут 32 секунды

    std::cin.get();

    судя по логике тут ты пытаешься вызвать метод статического объекта … ты тут ничего не забыл?
    Сапожник без сапог
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 10 ноября 2009 г. 3:10, спустя 22 минуты 41 секунду

    phpdude, там все в порядке
    Спустя 116 сек.

    phpdude, не. проверял. эта штука ждёт клавиши ентер.

    на самом деле не только enter, что словить enter и нужно было два cin.get(), так как cin.get() ждет ввода символа одного, а enter - это \r\n, по этому я и посоветовал два cin.get(), так как первый схавает \r а второй \n. У меня была какая-то подобная проблема.
    Спустя 257 сек.
    Mr.Pihto, обязательно покажешь как решил проблему
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 10 ноября 2009 г. 18:56, спустя 15 часов 46 минут 37 секунд


    std::cin.get();

    судя по логике тут ты пытаешься вызвать метод статического объекта … ты тут ничего не забыл?

    это пространства имен. я его пишу и перед cout, cin и тд. Можно вообще в начале написать using namespace std;

    Mr.Pihto, обязательно покажешь как решил проблему

    циклом.. все рабтало но после завершения одной итерации прорсто выключалось. а 2 cin.get() думаю помогли бы т.к 1 не ловил..

    Ура товарищи!
    клиент
    #include <stdio.h>
    #include <iostream>
    #include <winsock2.h>
    int main(){

    WSADATA WsaData;
    sockaddr_in peer;
    int s;
    int s1;
    int rc;
    int err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
              printf ("WSAStartup() failed: %ld\n", GetLastError ());
              return 1;
    }
    while(true){
    peer.sin_family = AF_INET;
    peer.sin_port = htons(7500);
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
    s = socket(AF_INET,SOCK_STREAM,0);
    rc = connect(s,(sockaddr*)&peer, sizeof(peer));
    char buf[100];
    char buf2[100];
    fgets(buf,100,stdin);
    if(send(s,buf,100,0)!=0){

    std::cout<<"->Server: "<<buf;
    }
    recv(s,buf2,100,0);
    std::cout<<"Server: "<<buf2<<"\n";
    closesocket(s);
    }
    return 0;
    }

    сервер

    #include <stdio.h>
    #include <iostream>
    #include <winsock2.h>
    int main(){

    WSADATA WsaData;
    struct sockaddr_in local;
    int s;
    int s1;
    int rc;
    int err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
              printf ("WSAStartup() failed: %ld\n", GetLastError ());
              return 1;
    }

    local.sin_family = AF_INET;
    local.sin_port = htons(7500);
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s<0){
    perror("socket error");
    exit(1);
    }else{
    std::cout<<"Create sock: OK\n";
              }
    rc = bind(s,(struct sockaddr*)&local, sizeof(local));
    if (rc<0){
    perror("bind error");
    exit(1);
    }else{
    std::cout<<"Bind: OK\n";
              }

              rc = listen(s,5);
              if(rc){
              perror("listen error");
    exit(1);
              }else{
    std::cout<<"Listen: OK\n";
    }
    while(true){
    s1 = accept(s,NULL,NULL);
    char buf[100];
       recv(s1,buf,100,0);
    std::cout<<"Client: "<<buf;
    send(s1,buf,100,0);

    }
    return 0;
    }
    Спустя 100 сек.
    если качаете -качайте clnt-srvr. второе прикрепление кривое.  я там поправлял..
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 10 ноября 2009 г. 10:34, спустя 15 часов 37 минут 19 секунд

    рульно, мне нравится
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 10 ноября 2009 г. 11:14, спустя 40 минут 12 секунд

    Mr.Pihto, стиль меня твой убивает…

    if (s<0){
    perror("socket error");
    exit(1);
    }else
    std::cout<<"Create sock: OK\n";
    Спустя 85 сек.
    а оформление кода вообще пипец
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 10 ноября 2009 г. 12:10, спустя 55 минут 58 секунд

    и сделай код хотя бы C#, пусть выделяется
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 10 ноября 2009 г. 17:31, спустя 5 часов 20 минут 53 секунды

    krasun, чет тег C# не работает
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 10 ноября 2009 г. 17:44, спустя 12 минут 56 секунд

    у меня он тоже не работал, по этому я использовал java, я думаю, без разницы какой тег, главное, что бы подсветка была, а у языков все равно у всех синтаксис сишный
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 14 ноября 2009 г. 17:15, спустя 3 дня 23 часа 31 минуту

    сделал я знач многопоточный сервер, чтоб можно было не один клиент подключать, но при дисконекте любого клиента  в окне сервера пишет такую срань
    И<0иr/PA
    тип того. мусор какойто

    #include <stdio.h>
    #include <iostream>
    #include <winsock2.h>

    DWORD WINAPI ThreadFunc(LPVOID s1)
    {
       SOCKET s2=((SOCKET *) s1)[0];
      char buf[100];
     
       recv(s2,buf,100,0);
                   std::cout<<"Client: "<<buf;
                   send(s2,buf,100,0);
       closesocket(s2);
       return 0;
    }

    int main(){

    WSADATA WsaData;
           struct sockaddr_in local;
           int s;
           int rc;
    SOCKET s1;
                   int err = WSAStartup (0x0101, &WsaData);
           if (err == SOCKET_ERROR)
           {
              printf ("WSAStartup() failed: %ld\n", GetLastError ());
              return 1;
           }

           local.sin_family = AF_INET;
           local.sin_port = htons(7500);
           local.sin_addr.s_addr = htonl(INADDR_ANY);
           s = socket(AF_INET,SOCK_STREAM,0);
           if (s<0){
                   perror("socket error");
                   exit(1);
           }else{
                   std::cout<<"Create sock: OK\n";
              }
           rc = bind(s,(struct sockaddr*)&local, sizeof(local));
           if (rc<0){
                   perror("bind error");
                   exit(1);
           }else{
                   std::cout<<"Bind: OK\n";
           }

           rc = listen(s,5);
           if(rc){
                   perror("listen error");
                   exit(1);
           }else{
                   std::cout<<"Listen: OK\n";
           }
           while(true){
    s1 = accept(s,NULL,NULL);
    DWORD thID;
    CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
           }
    return 0;
    }

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