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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> winsock2, Клиент -- на C++, сервер -- на Delphi 
V
    Опции темы
X-3R1
Дата 10.4.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема при использовании различных языков для реализации сервера.

Когда и клиент и сервер написаны на C++, то всё работает как надо. При написании сервера на Delphi возникают проблемы: клиенту приходит первая посылка с нормальными данными, затем всегда присылаются 0 байт (т.е. все байты в буфере заполнены нулевыми символами), хотя сервер данные отсылает.

Реализация сервера должна быть именно на Delphi )

клиент C++
Код

//
// занесение IP адреса и порта
//
mIp = new char[strlen(ip) + 1];
for(int j = 0; j < strlen(ip) + 1; j++)
mIp[j] = ip[j];    
mPort = port;

//
// инициализация библиотеки для работы с сокетами
//
WSADATA stWSADataTCPIP;
WSAStartup(0x0101, &stWSADataTCPIP)

//
// занесение данных в структуры
//
mPeer.sin_family = AF_INET;
mPeer.sin_port = htons(mPort);
mPeer.sin_addr.s_addr = inet_addr(mIp);    

//
// создание сокета
// 
mSocket = socket(AF_INET, SOCK_STREAM, 0);

//
// подключение к сокету
//
mResult = ::connect(mSocket, (struct sockaddr*)&mPeer, sizeof(mPeer));

// принимаем данные
for(;;){
    mResult = recv(mSocket, mTmpData, strlen(mTmpData), 0);
    if(mResult <= 0)
        throw (TcpReadError(mIp, mPort, ""));
    mTmpData[mResult] = '\0';

    //
    // обрабатыаем данные
    //
    ...
}


C++ сервер
Код

//
// инициализация
//
WSAStartup(0x0101, &stWSADataTCPIP)

local.sin_family = AF_INET;
local.sin_port = htons(5050);
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

s = socket(AF_INET, SOCK_STREAM, 0);
rc = bind(s, (struct sockaddr *)&local, sizeof(local));
rc = listen(s, 5);
s1 = accept(s, NULL, NULL);

//
// отправляем данные
// 
for(;;){
    char buff[] = "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*";
    rc = send(s1, buff, strlen(buff), 0);
    if(rc <= 0)
    {
        std::cout << "send failed" << std::endl;
    }
}


Delphi сервер
Код

procedure tsoket.execute;
var
i,j: integer;
s: string;
begin
  inherited;
    WSAStartup($101,Data);

    Soc:=Socket(AF_Inet,Sock_Stream,0);
    Addr.sin_family:=PF_Inet;
    Addr.sin_port:=HToNS(5050);
    Addr.sin_addr.S_addr:=InAddr_Any;
    FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);

    Bind(Soc,Addr,SizeOf(TSockAddr));
    Listen(Soc,SoMaxConn);
    Len:=SizeOf(TSockAddr);
    AcceptedSock:=Accept(Soc,@Addr,@Len);

    while True do
     begin
      send(AcceptedSock, buff, sizeof(buff), 0);
     end;
end;

PM MAIL   Вверх
baldina
Дата 10.4.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

send(AcceptedSock, buff, sizeof(buff), 0);

buff какого типа?
PM MAIL   Вверх
X-3R1
Дата 10.4.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

buff: array [1..2048] of char;



Код

procedure Tprocessing.rel_angles_sock;
var
r: real;
s: string;
I,J: Integer;
  k: Integer;

//
// полезные данные заносятся в начале в string, а затем переносятся в buff
//
begin
S:= FormatFloat('#00.00000', course_abs[0]*pi/180)+' '+FormatFloat('#00.00000', pitch_abs[0]*pi/180);
i:=0;
repeat
begin
S:= S+' '+ FormatFloat('#00.00000', course_rel[i]*pi/180) + ' ' + FormatFloat('#00.00000', pitch_rel[i]*pi/180);
inc(i);
end;
until i > modul_n-1;

S:=S + '*';


for j := 1 to length(s) do
begin
buff[j] := s[j];
end;
S:='';
end;

PM MAIL   Вверх
xvr
Дата 10.4.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Строка 34 клиента:
Цитата(X-3R1 @  10.4.2008,  10:08 Найти цитируемый пост)
    mResult = recv(mSocket, mTmpData, strlen(mTmpData), 0);
И чему равен strlen(mTmpData)? Может имелся в виду sizeof?
Удивительно, что это на С++ работает  smile 

PM MAIL   Вверх
X-3R1
Дата 10.4.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2xvr
да smile Но основная проблема не в этом.
PM MAIL   Вверх
baldina
Дата 10.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


 




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


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

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