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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> простой tcp/ip client, проблема с выводом полученой строки 
V
    Опции темы
Robin
Дата 16.5.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.12.2006

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



по мсдну написал следуйщее:
сервер:
Код

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

int main() {

  WSADATA wsaData;
  SOCKET RecvSocket;
  struct sockaddr_in peer;
  int Port = 27015;
 char RecvBuf[1024];
  int  BufLen = 1024;
  struct sockaddr_in SenderAddr;
  int SenderAddrSize = sizeof(SenderAddr);

  WSAStartup(MAKEWORD(2,2), &wsaData);

  RecvSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  peer.sin_family = AF_INET;
  peer.sin_addr.s_addr = inet_addr("127.0.0.1");
  peer.sin_port = htons(27015);(INADDR_ANY);

  bind(RecvSocket, (SOCKADDR *) &peer, sizeof(peer));


  if (listen(  RecvSocket, 1 ) == SOCKET_ERROR) {
    printf("Error listening on socket.\n");
    closesocket( RecvSocket);
    WSACleanup();
    return 1;
  }


  SOCKET AcceptSocket;
  printf("Waiting for client to connect...\n");



  AcceptSocket = accept(RecvSocket, NULL, NULL );
  if (AcceptSocket == INVALID_SOCKET) {
    printf("accept failed: %d\n", WSAGetLastError());
    closesocket(RecvSocket);
    WSACleanup();
    return 1;
  } else
    printf("Client connected.\n");

 printf("Receiving datagrams...\n");
  recv(RecvSocket,
    RecvBuf,
    BufLen,
    0);
for(int i = 0; i<strlen(RecvBuf); i++)
    {
printf("%c",  RecvBuf[i]);
}


  printf("Finished receiving. Closing socket.\n");
  closesocket(RecvSocket);


  printf("Exiting.\n");
  WSACleanup();
  return 0;
}


клиент:


Код

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

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int __cdecl main() {

    //----------------------
    // Declare and initialize variables.


    int iResult;
  WSADATA wsaData;
    SOCKET ConnectSocket;
    struct sockaddr_in clientService;

    char *sendbuf = "this is a test";
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;

    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
      printf("WSAStartup failed: %d\n", iResult);
      return 1;
    }

    //----------------------
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }

    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );

    //----------------------
    // Connect to server.
    iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    if ( iResult == SOCKET_ERROR) {
        closesocket (ConnectSocket);
        printf("Unable to connect to server: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Send an initial buffer
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
}

    printf("Bytes Sent: %ld\n", iResult);

    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();

    return 0;
}


когда вывожу строку, появляется абракадабра.
что делать?

Это сообщение отредактировал(а) Robin - 16.5.2007, 19:02
PM MAIL   Вверх
Sartorius
Дата 16.5.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



 Строчку покажи. Где и какую строку ты выводишь.  smile 
PM MAIL ICQ   Вверх
Robin
Дата 16.5.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.12.2006

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



Sartorius 
 
Цитата

printf("Receiving datagrams...\n");
  recv(RecvSocket,
    RecvBuf,
    BufLen,
    0);
for(int i = 0; i<strlen(RecvBuf); i++)
    {
printf("%c",  RecvBuf[i]);

Цитата


    char *sendbuf = "test";

Цитата


iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );

PM MAIL   Вверх
ptr
Дата 17.5.2007, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



recv не добавляет в строку завершающий '\0', поэтому это надо делать самому:
Код

int len = recv(RecvSocket, RecvBuf, BufLen, 0);
RecvBuf[len]='\0';



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


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.12.2006

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



всеравно

Код

int len = recv(RecvSocket, RecvBuf, BufLen, 0);
RecvBuf[len]='\0';
printf(RecvBuf);


Код


C:\Documents and Settings\Стас>C:\lcc\lcc\servvvv.exe
Waiting for client to connect...
Client connected.
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ☻Exiting.

PM MAIL   Вверх
ptr
Дата 18.5.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Неправильный сокет в recv, надо:
Код

recv(AcceptSocket, RecvBuf, BufLen, 0);



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


 




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


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

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