Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > [C++ .net] Сервер + клиент (TCP)


Автор: Sergio 22.1.2007, 01:19
Здраствуйте. Читал доки по 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);


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

Автор: mr.DUDA 22.1.2007, 11:43
Модератор: перемещено из .NET

Автор: ptr 22.1.2007, 13:04
Цитата(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));  //Связывание даных с сокетом

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

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

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

Автор: Sergio 22.1.2007, 22:21
ptr,  спасибо за советы. Буду доделовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)