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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ .net] Сервер + клиент (TCP), присылается неизвестно что.... 
V
    Опции темы
Sergio
Дата 22.1.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Здраствуйте. Читал доки по winsock и решил написать серверную и клиентскую части. Но проблема: сервер принимает от клиента какие-то неизвестные символы smile (похожи на "столбики"). Вот код:
Сервер:
Код
using namespace std;
    WSADATA wsa;                                                // Info about winsock2
    char szRecvBuff[1024];
    int error;
    WSAStartup(MAKEWORD(1,0), &wsa);                            // Loading library winsock2
    SOCKET mySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    // Создание сокета
      
     sockaddr_in AdressInfo;
     AdressInfo.sin_family = AF_INET;                           // Internet technology (TCP,UDP etc)
     AdressInfo.sin_port = htons(4888);
     AdressInfo.sin_addr.s_addr=htonl(INADDR_ANY);

    error = bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo));  //Связывание даных с сокетом
     switch(error)
      {
        case 0: cout<<"\tBind . . . OK\n"; break;
        default: cout<<"Bind . . . ERROR\n"; break;
      };
    error = listen(mySocket, 5);                                         // Прослушка
     switch(error)
      {
        case 0: cout<<"\tListen process . . . OK\n"; break;
        default: cout<<"Listen process . . . ERROR\n"; break;
      };
     int AdressInfoSize = sizeof(AdressInfo);
     while (1)
      {
        accept(mySocket, (struct sockaddr *)&AdressInfo,&AdressInfoSize);
        recv(mySocket, szRecvBuff, 1024, 0);
        Sleep(5000);
         for(int a=0; a<1024; a++)
             cout<<szRecvBuff[a];        
      }

Клиент:
Код
    using namespace std;
    WSADATA wsa;                                                // Info about winsock
    char    szSendBuff[1024]="Hello world";

    WSAStartup(MAKEWORD(1,0), &wsa);                            // Loading library ws2_32.lib
    SOCKET mySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    // Создание сокета

     sockaddr_in AdressInfo;

     AdressInfo.sin_family = AF_INET;                           // Internet technology (TCP,UDP etc)
     AdressInfo.sin_port = htons(4888);
     AdressInfo.sin_addr.s_addr=inet_addr("127.0.0.1");
     
     bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo));  //Связывание даных с сокетом
     int AdressInfoSize = sizeof(AdressInfo);
    
     cout<<connect(mySocket,(SOCKADDR*)&AdressInfo,AdressInfoSize);     // Подключение
     send(mySocket,szSendBuff,1024,0);


Зарание спасибо. Буду очень благодарен

Это сообщение отредактировал(а) Sergio - 22.1.2007, 01:20
PM MAIL ICQ   Вверх
mr.DUDA
Дата 22.1.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Модератор: перемещено из .NET


--------------------
user posted image
PM MAIL WWW   Вверх
ptr
Дата 22.1.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(Sergio @  22.1.2007,  04:19 Найти цитируемый пост)
Читал доки по winsock и решил написать серверную и клиентскую части.

Плохо читал. Перечитай-ка ещё раз.

Код

accept(mySocket, (struct sockaddr *)&AdressInfo,&AdressInfoSize);
recv(mySocket, szRecvBuff, 1024, 0);

1. Повторно использовать AdressInfo не хорошо. Если тебя не интересует информация о подключившемся, то можно передавать NULL.
2. accept возвращает сокет, который нужно дальше использовать для работы с клиентом. mySocket в данном случае служит только для подключения.
Т.е.
Код

SOCKET connectedSocket=accept(mySocket, NULL, 0);
recv(connectedSocket, szRecvBuff, 1024, 0);


Код

Sleep(5000);

Вот этого в сетевом приложении быть никогда не должно (если явно не нужно smile ).

Код

for(int a=0; a<1024; a++)
cout<<szRecvBuff[a];

И что ты хочешь после этого увидеть на экране? В твоём случае szRecvBuff будет содержать мусор.
Сделай так:
Код

cout<<szRecvBuff;


Код

switch(error)      {
.................
default: cout<<"Listen process . . . ERROR\n"; break;      };

Подумаешь случилась какая-то ошибка, давайте работать дальше smile .

Код

bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo));  //Связывание даных с сокетом

Вот этого на клиенте делать не рекомендуется. Тем более, что, если запущен сервер, то это не сработает.

Ну и последнее. Кто ошибки будет обрабатывать? Если ты будешь обрабатывать ошибки, то большей части вопросов и проблем не будет.

Это всё, что было из грубых ошибок. Исправь их и всё нормально будет работать.

Это сообщение отредактировал(а) ptr - 22.1.2007, 13:07


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Sergio
Дата 22.1.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



ptr,  спасибо за советы. Буду доделовать.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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