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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение данных через socket 
:(
    Опции темы
klepa
Дата 29.8.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток. 
При работе с сокетами столкнулась с такой проблемой. У меня в сети есть сервер, который пересылает данные определенной структурыЖ строка, в кторой 15 параметров, отделенных друг от друга запятыми. Строки разделены между собой вводом.
Мне необходимо принимать эти строки, и забирать нужные мне данные. Максимально возможная длинна строки - 200 бит. Однако возникла проблема. каким образом вести прием чтобы не потерять данные (передача ведется непрерывно. порой даже доходит до десятка сообщений в секунду. хотя такое бывает редко) и каким образом разделить прием так, чтобы он у меня принимал именно одну строку?
на данный момент у меня такой код:
Код

#include "stdafx.h"
#include "Winsock2.h"
#include "Windows.h"
#include "stdio.h"
#include "string.h"
#pragma comment(lib, "ws2_32.lib")

int main()
{
    int sd;
    int bindw;
    struct sockaddr_in addr_in;                
    struct sockaddr asd;
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
 
    wVersionRequested = MAKEWORD( 2, 0 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        return -1;
    }
    ZeroMemory(&asd, sizeof(asd));
    char buff[1024];
    if ((sd=socket(AF_INET, SOCK_STREAM , 0))>0)        
        printf("%d%s\n", sd, "the socket is successfull create");        
    else 
    {
        printf("Error bind %d\n",WSAGetLastError());
        closesocket(sd); 
        WSACleanup();
        return -2;
    }
    ZeroMemory(&addr_in, sizeof(addr_in));                
    addr_in.sin_family=AF_INET;                            
    addr_in.sin_port=htons(1286);//argv[2];
    addr_in.sin_addr.s_addr=inet_addr("192.168.0.101");
    // printf("Attempting to connect to ");
    int con =connect(sd,  (sockaddr*)(&addr_in), sizeof(addr_in));
         
        if (con!=0)
            printf("could not connect.");



    int iSize = sizeof(SOCKADDR_IN);
    char        tempBuffer[200];
    SOCKADDR_IN sSockRecv;

    while(true)
        {
            int retval;
            retval = recvfrom(sd, tempBuffer, 200,0, (LPSOCKADDR)&sSockRecv, &iSize);
                  }


    closesocket(sd);
    WSACleanup();
        return 0;
}



Однако получается что в буфер записывается больше чем одна строка. Подскажите, пожалуйста. как можно решить эту проблему?
PM MAIL   Вверх
Олег2005
Дата 29.8.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Цитата(klepa @  29.8.2011,  09:38 Найти цитируемый пост)
SOCK_STREAM


Цитата(klepa @  29.8.2011,  09:38 Найти цитируемый пост)
recvfrom

Непонятно, почему из потокового сокета вы считывает с помощью датаграммного чтения?
recvfrom() работает иначе, чем recv()

PM MAIL WWW MSN   Вверх
Townsmen
Дата 31.8.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Посоветуйте хороший справочник, где исчерпывающе описаны все функции С++ в том числе функции recvfrom() и recv()
PM MAIL   Вверх
newbee
Дата 31.8.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(Townsmen @  31.8.2011,  22:22 Найти цитируемый пост)
Посоветуйте хороший справочник, где исчерпывающе описаны все функции С++ в том числе функции recvfrom() и recv() 
 http://www.unpbook.com


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 31.8.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Townsmen @  31.8.2011,  21:22 Найти цитируемый пост)
функции С++

и - 
Цитата(Townsmen @  31.8.2011,  21:22 Найти цитируемый пост)
recvfrom() и recv()

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


 




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


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

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