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


Автор: X-3R1 10.4.2008, 10:08
Проблема при использовании различных языков для реализации сервера.

Когда и клиент и сервер написаны на 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;

Автор: baldina 10.4.2008, 10:30
Код

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

buff какого типа?

Автор: X-3R1 10.4.2008, 12:57
Код

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;

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

Автор: X-3R1 10.4.2008, 14:44
2xvr
да smile Но основная проблема не в этом.

Автор: baldina 10.4.2008, 15:33
похоже в С++ и Delphi у тебя буферы разных размеров. А клиент размер не принимает, и вообще ориентируется на странный strlen(mTmpData). буфер в дельфях сильно больше? ну тогда сначала клиент принимает то что ожидается, потом остатки (нули)

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