Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2009, 17:25   #1
Вишенка
Новичок
Джуниор
 
Регистрация: 08.08.2009
Сообщений: 3
Вопрос Клиент-Сервер на WinSock

Ребята!!!! Помогите, плиз! Коннект происходит, всё функции без ошибок выполняются а buff всёравно пуста... Чего не хватает???

Код Клиента:

WSAStartUp(MakeWord(1,0),WSD);
sock:=socket(PF_INET,SOCK_STREAM,IP PROTO_IP);
if sock=invalid_socket then memo1.Lines.Add('SoCket error') else
memo1.Lines.Add('SoCket Done');
SA.sin_family:=PF_INET;
SA.sin_addr.S_addr:=INADDR_ANY;
SA.sin_addr:=in_addr(d_addr('172.16 .178.190'));
SA.sin_port:=htons(1100);
ret:=connect(sock,SA,sizeof(SA));
if ret=socket_error then memo1.Lines.Add('Connect error') else
memo1.Lines.Add('Connect done');
buff:='5512';
ret:=send(sock,buff,4,0);
if ret=socket_error then memo1.Lines.Add('Send error') else
memo1.Lines.Add('Send Done');
closesocket(sock);
WSACleanUp;


Код Сервера:

assignfile(log,'log.txt');
rewrite(log);

WSAStartUp(makeword(1,0),WSD);

sock:=socket(PF_INET,SOCK_STREAM,IP PROTO_IP);
if sock=invalid_socket then writeln(log,'Socket Error') else
writeln(log,'Socket Done');

SA.sin_family:=PF_INET;
SA.sin_addr:=in_addr(d_addr('172.16 .178.190'));
SA.sin_port:=htons(1100);

ret:=bind(sock,Sa,sizeof(sa));
if ret=Socket_Error then writeln(log,'Bind Error') else
writeln(log,'Bind Done');

ret:=listen(sock,1);
if ret=Socket_Error then writeln(log,'Listen Error') else
writeln(log,'Listen Done');

sk:=accept(sock,nil,nil);
if sk=Invalid_Socket then writeln(log,'Accept Error') else
writeln(log,'Accept Done');

ret:=recv(sk,buff,4,1);
if ret=Socket_Error then writeln(log,'Recv Error') else
writeln(log,'Recv Done');


label1.Caption:=buff;
closesocket(sock);
WSACleanUp;
closefile(log);

заранее, спасибо
Вишенка вне форума Ответить с цитированием
Старый 08.08.2009, 17:36   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Исходя из вашего кода, чтобы все заработало, у вас практически за очень короткое время одновременно должны вызываться accept у сервер и connect у клиента короче говоря, если исходить со стороны сервера, вы в обязаны в цикле пробовать accept, и если не ошибка то создавать отдельный поток (ну или ,если один клиент, продолжать работу), если ошибка то продолжать цикл. В таком случае клиент должен запускаться после того как сервер запущен.

ну это я так быстро глянув на код, не смотрел детали вообщем.

Edit 1

Извените, не дочитал вопрос я подозреваю buff это String ?
Тогда не так
Код:
ret:=send(sock,buff,4,0);
а так
Код:
ret:=send(sock,Pointer(buff)^,Length(buf),0);
Разумеется, если версия не уникод, если уникод то
Код:
ret:=send(sock,Pointer(buff)^,Length(buf) * SizeOf(Char),0);
Edit 2

Для получения recv - аналогично, только сначала SetLength(buff, 4) сделайте

Последний раз редактировалось BOBAH13; 08.08.2009 в 17:40.
BOBAH13 вне форума Ответить с цитированием
Старый 08.08.2009, 17:53   #3
Вишенка
Новичок
Джуниор
 
Регистрация: 08.08.2009
Сообщений: 3
По умолчанию

BOBAH13, Спасибо тебе большое)) Теперь поняла)
Вишенка вне форума Ответить с цитированием
Старый 24.02.2010, 00:45   #4
Siber_Dec
 
Регистрация: 10.08.2007
Сообщений: 9
По умолчанию

Есть вопрос по поводу передачи сообщения, если мы изначально не знаем тип передаваемого сообщения, мы можем получить размер полученного буфера?

1) необходимо перевести сокет в неблокирующий режим


?№1 и новый вопрос, если я хочу обслуживать одним сервером 10000 клиентов подключенных одновременно это возможно, или нужно искать другие пути?

?№2 можно ли неблокирующий сокет перевести в поток?

Последний раз редактировалось Siber_Dec; 24.02.2010 в 09:26. Причина: дополнение
Siber_Dec вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ftp клиент на winsock sergoss Работа с сетью в Delphi 1 07.05.2009 19:07
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Многопользовательский сервер на Winsock SirToxa Работа с сетью в Delphi 7 27.03.2008 15:29
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57