Sockets, Сервер не работает.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Polinom2686
незнакомец
Сообщения: 8
Зарегистрирован: 02.09.2009 02:01:29

Sockets, Сервер не работает.

Сообщение Polinom2686 »

Всем привет. Тренируюсь в работе с сокетами.
Проблема в том, что сервер не принимает данные от клиента. Это при том, что клиент пишет, что данные отправлены.
Сервер пишет Listen - OK и данные не принимает.

Подскажите, что не так.

IP сервера: 172.23.170.74
IP клиента: 172.23.173.74

Компилятор FPC 2.2.2

Сервер

Код: Выделить всё

Program Sockets_;

Uses Crt,Sockets;

Var Sock,Sock_new : LongInt;
    SAddr : TInetSockAddr;
    buf : ^Word;
    Key_ : Boolean;
    SAddrLength : LongWord;

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(50000);
SAddr.sin_addr:=StrToNetAddr('172.23.170.74');
If (fpbind(Sock,@SAddr,SizeOf(SAddr)) = -1) then begin
                                                 Writeln('Bind Error ',SocketError,'    press Enter');
                                                 ReadLn;
                                                 Halt;
                                                 end
                                            else writeln ('Bind - OK');
If (fplisten(Sock,1) = -1) then begin
                                Writeln('Listen Error, press Enter');
                                ReadLn;
                                Halt;
                                end
                           else writeln ('Listen - OK');
Key_:=True;
New(buf); 
While Key_ do begin  //Программа выполняет цикл, но данные не читает.
              Sock_new:=fpaccept(Sock,@SAddr,@SAddrLength);
              If (Sock_new >= 0) then writeln ('New socket - OK');
              If (fprecv(Sock_new,@buf,SizeOf(Word),0)>=0) then begin
                                                                WriteLn(buf^);
                                                                Dispose(buf);
                                                                Key_:=False;
                                                                end;
              Delay(1);
              end;
If (Shutdown(Sock_new,2) = 0) then begin
                                   WriteLn('Socket closed, press Enter.');
                                   ReadLn;
                                   Halt;
                                   end;
End.




Клиент

Код: Выделить всё

Program Sockets_;

Uses Crt,Sockets;

Var Sock,Sock_new : LongInt;
    SAddr : TInetSockAddr;
    buf : ^Word;
    Key_ : Boolean;
    SAddrLength : LongWord;

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(50000);
SAddr.sin_addr:=StrToNetAddr('172.23.170.74');
Key_:=True;
New(buf);
buf^:=26;
While Key_ do begin
              If (fpconnect(Sock,@SAddr,SizeOf(SAddr)) <> -1) then
                     begin
                     WriteLn('Connect - OK');
                     If (fpsend(Sock,@buf,SizeOf(Word),0)>=0) then begin
                                                                   WriteLn('Send - OK');
                                                                   Dispose(buf);
                                                                   Key_:=False;
                                                                   end;
                     end;
              Delay(1);
              end;
If (Shutdown(Sock,2) = 0) then begin
                               WriteLn('Socket closed, press Enter.');
                               ReadLn;
                               Halt;
                               end;
End.
pihter
новенький
Сообщения: 12
Зарегистрирован: 13.01.2010 01:40:33
Контактная информация:

Сообщение pihter »

Просмотрел все, вроде верно.
Цикл, говоришь, крутится? Стало быть, вот тут:

Код: Выделить всё

If (fprecv(Sock_new,@buf,SizeOf(Word),0)>=0) then begin

fprecv возвращает -1. Это, если я правильно понимаю, ошибка приема данных на уровне ОС. Кстати, ОС какая? Может его фаёвол перехватывает или, там, антивирус какой... уверен, что с сетевой подсистемой все в порядке?
Polinom2686
незнакомец
Сообщения: 8
Зарегистрирован: 02.09.2009 02:01:29

Сообщение Polinom2686 »

Всем спасибо, решил проблему самостоятельно

http://forum.sources.ru/index.php?showtopic=291403

Добавлено спустя 1 минуту 22 секунды:
ОС - Windows XP
Polinom2686
незнакомец
Сообщения: 8
Зарегистрирован: 02.09.2009 02:01:29

Сообщение Polinom2686 »

В продолжении темы:
Как с помощью Сокетов связываться не только по локальной сети, но и через интернет?
При этом известны IP адреса (в локальной сети и внешний адрес) как сервера, так и клиента.
pihter
новенький
Сообщения: 12
Зарегистрирован: 13.01.2010 01:40:33
Контактная информация:

Сообщение pihter »

Сокету все равно работает он в ЛС или в Интернете. Следоветельно, работать с сокетами в Интернете нужно так же как и в локальной сети. Если IP-адрес сервера доступен с машины, на которой работает клиент - то делать нужно все так же как и в ЛС. (Доступность сервера можно проверить конандой ping) Если сервер недоступен, значит нужно сделать чтобы был доступен, например обзавестись реальным IP-адресом
Polinom2686
незнакомец
Сообщения: 8
Зарегистрирован: 02.09.2009 02:01:29

Сообщение Polinom2686 »

Спасибо.
Ответить