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


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

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

Автор: Rouse_ 10.4.2008, 23:47
Цитата(X-3R1 @  10.4.2008,  11:09 Найти цитируемый пост)
затем всегда присылаются 0 байт

Эмм? Это как? 1 байт я конечно могу понять, но чтоб 0 байт да еще и прислалось...

Автор: Mikh@il 11.4.2008, 15:40
Код

   Soc:=Socket(AF_Inet,Sock_Stream,0);
   Addr.sin_family:=PF_Inet;



Почему в одном случае семейство AF_Inet а во втором PF_Inet ????


А еще какой-то у тя сервер странный ниче не принимает(recv),

только по какому-то условию: 

 while True do
  отправляет (send)

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