Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Получение данных через socket


Автор: klepa 29.8.2011, 10:38
Всем доброго времени суток. 
При работе с сокетами столкнулась с такой проблемой. У меня в сети есть сервер, который пересылает данные определенной структурыЖ строка, в кторой 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;
}



Однако получается что в буфер записывается больше чем одна строка. Подскажите, пожалуйста. как можно решить эту проблему?

Автор: Олег2005 29.8.2011, 18:44
Цитата(klepa @  29.8.2011,  09:38 Найти цитируемый пост)
SOCK_STREAM


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

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

Автор: Townsmen 31.8.2011, 21:22
Посоветуйте хороший справочник, где исчерпывающе описаны все функции С++ в том числе функции recvfrom() и recv()

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

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

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

== противоречия. ибо с++ ничего не знает о сокетах. а последние, это Си функции.
либо, для плюсов - http://www.boost.org/doc/libs/1_47_0/libs/asio/index.html.

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