repeat
Received := fpRecv(Sock, @Buffer[0], 5000, 0);
if Received < 0 then
WriteLn('[done]');
SS := '';
for i := 0 to Received-1 do SS := SS + chr(Buffer);
Write(SS);
until Received <= 0;
Не работает отправка данных в сокете.
Цитата:
program test;
uses
crt, sockets;
Var
Sock, Sock_new: LongInt;
SAddr: TInetSockAddr;
buf: ^Word;
Sx: String;
S: ^String;
Ln: Integer;
SAddrLength: LongWord;
Received, i: Integer;
Buffer: array[0..5000] of Byte;
Ss: String;
Begin
ClrScr;
Sock := fpsocket(AF_INET, SOCK_STREAM, 0);
If (Sock = -1) then begin
Writeln('Socket Error');
ReadLn;
Halt;
end else
writeln ('Socket created - OK');
SAddr.sin_family := AF_INET;
SAddr.sin_Port := htons(1234);
SAddr.sin_addr := StrToNetAddr('127.0.0.1');
New(buf);
buf^ := 26;
If (fpconnect(Sock,@SAddr,SizeOf(SAddr)) <> -1) then begin
WriteLn('Connect - OK');
for i := 1 to 50 do begin
Sx := 'test'MESSAGE KEY MISSING: '13'10#11;
Received := fpsend(Sock,@Sx,Length(Sx),1);
WriteLn(Received);
end;
repeat
Received := fpRecv(Sock, @Buffer[0], 5000, 0);
if Received < 0 then
WriteLn('[done]');
SS := '';
for i := 0 to Received-1 do SS := SS + chr(Buffer);
Write(SS);
until Received <= 0;
end else begin
WriteLn('Connect - Error');
end;
fpShutDown(Sock, 2);
CloseSocket(Sock);
WriteLn('Socket closed, press Enter.');
ReadLn;
Halt;
End.
uses
crt, sockets;
Var
Sock, Sock_new: LongInt;
SAddr: TInetSockAddr;
buf: ^Word;
Sx: String;
S: ^String;
Ln: Integer;
SAddrLength: LongWord;
Received, i: Integer;
Buffer: array[0..5000] of Byte;
Ss: String;
Begin
ClrScr;
Sock := fpsocket(AF_INET, SOCK_STREAM, 0);
If (Sock = -1) then begin
Writeln('Socket Error');
ReadLn;
Halt;
end else
writeln ('Socket created - OK');
SAddr.sin_family := AF_INET;
SAddr.sin_Port := htons(1234);
SAddr.sin_addr := StrToNetAddr('127.0.0.1');
New(buf);
buf^ := 26;
If (fpconnect(Sock,@SAddr,SizeOf(SAddr)) <> -1) then begin
WriteLn('Connect - OK');
for i := 1 to 50 do begin
Sx := 'test'MESSAGE KEY MISSING: '13'10#11;
Received := fpsend(Sock,@Sx,Length(Sx),1);
WriteLn(Received);
end;
repeat
Received := fpRecv(Sock, @Buffer[0], 5000, 0);
if Received < 0 then
WriteLn('[done]');
SS := '';
for i := 0 to Received-1 do SS := SS + chr(Buffer);
Write(SS);
until Received <= 0;
end else begin
WriteLn('Connect - Error');
end;
fpShutDown(Sock, 2);
CloseSocket(Sock);
WriteLn('Socket closed, press Enter.');
ReadLn;
Halt;
End.
Собственно вот код.. Создаю сокет, подключаюсь нормально, данные приходят нормально, но сервер их не принимает. Через telnet и netcat проверил - всё отлично. Сервер принял данные, а через fpsend нет.
Что я делаю не так? (:
ЗЫ: fpc компилятор. кроссплатформенный код под Linux/Windows. Не работает одинакого везде)
Вы ведь используете TCP, а не UDP. Следовательно, чтобы заставить сервер чего-то принять, нужно вызвать listen() и accept(), а вы этого не делаете. Клиентская часть у вас правильная, а серверная - нет.
Здесь только клиент. Сервер написан на C++. Клиенту не нужно listen и accept
Код:
[/QUOTE]
А вот это тогда что, если не серверная часть?
P.S. Я повторюсь, в клиентской части ошибок нет. Сниффером смотрели, что отправляется?
Сниффером не смотрел. Здесь нет серверной части. Только клиент, который подсоединяется, отправляет данные и бесконечно слушает сервер. Проблема в том, что данные не уходят.
И еще раз повторюсь, что через telnet и netcat данные сервер отлично принимает.
если не верите :) Попробуйте через telnet отправить данные и через fpsend(
Цитата: Vidog
Это считывание данных с сервера.
Я прошу прощения, это меня переклинило насчет сервера. :) Сейчас попробуем.
[1316873574] {*****:29236 # @} -- abcd
[1316873577] {*****:29236 # @} -- abcdefg
[1316873581] {*****:29236 # @} -- 123
[1316873581] {*****:29236 # @} -- 12345
[1316873583] {*****:29236 # @} --
[1316873584] {*****:29236 # @} -- QDF
[1316873590] {*****:29236 # @} -- {Disconnected}
ip скрыл в целях безопасности )
Это, видимо, через Telnet?
[1316873838] {*****:58273 # @} -- {Connected}
[1316873845] {*****:58273 # @} -- {Disconnected}
Потому что дальше следовало это ) Данные не ушли, но соединение было успешным.
Да, это через telnet.
А можете сервер показать? Есть у меня пару соображений по этому поводу.
Вообще, там тонна кода, но вот куски, думаю что это важно:
Код:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET S = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in srvAddr = {0};
char buf[1024] = {0};
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr("31.186.97.226");
srvAddr.sin_port = htons(722);
if (connect(S, (const sockaddr *)&srvAddr, sizeof(sockaddr_in)) != 0) {
printf("%s\n", "Failed to connect!");
return 1;
}
send(S, "12345\r\n", 7, 0);
send(S, "89012\r\n", 7, 0);
while (recv(S, buf, 1024, 0)) {
printf("%s", buf);
ZeroMemory(buf, 1024);
}
closesocket(S);
WSACleanup();
return 0;
}
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET S = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in srvAddr = {0};
char buf[1024] = {0};
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr("31.186.97.226");
srvAddr.sin_port = htons(722);
if (connect(S, (const sockaddr *)&srvAddr, sizeof(sockaddr_in)) != 0) {
printf("%s\n", "Failed to connect!");
return 1;
}
send(S, "12345\r\n", 7, 0);
send(S, "89012\r\n", 7, 0);
while (recv(S, buf, 1024, 0)) {
printf("%s", buf);
ZeroMemory(buf, 1024);
}
closesocket(S);
WSACleanup();
return 0;
}
Получил тот же эффект, что и от телнета.
[1316873979] {*****:12597 # @} -- {Disconnected}
[1316874180] {*****:31029 # @} -- {Connected}
[1316874203] {*****:31029 # @} -- {Disconnected}
[1316874219] {*****:31285 # @} -- {Connected}
[1316874219] {*****:31285 # @} -- 12345
[1316874225] {*****:31285 # @} -- {Disconnected}
[1316874235] {*****:31541 # @} -- {Connected}
[1316874235] {*****:31541 # @} -- 12345
[1316874247] {*****:31541 # @} -- {Disconnected}
[1316874891] {*****:60471 # @} -- {Connected}
[1316874891] {*****:60471 # @} -- 12345
[1316874891] {*****:60471 # @} -- 89012
[1316874894] {*****:60471 # @} -- {Disconnected}
Схема подключения, на сколько я вижу отличается только "IPPROTO_TCP" или нет? :) дело в fpc или в чем-то еще?
Код:
send(S, "12345\r\n89012\r\n", 14, 0);
уже не работает. Возможно, это специфика сервера, я не успел подробно разобрать этот момент в серверном коде.
[1316876398] {*****:20905 # @} -- {Connected}
[1316876398] -- Б@
[1316876398] -- Б@
[1316876414] {*****:20905 # @} -- {Disconnected}
Вот, что от меня приходит.. Не подскажите, пожалуйста как послать тип String? Я в pascal не силён.
Спасибо огромное)