Проблема при использовании различных языков для реализации сервера.
Когда и клиент и сервер написаны на 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;
|
|