Delta RuBoard
Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору всем снова привет. есть консольное приложение на winsock на подобии чата http://articles.org.ru/cfaq/index.php?qid=2207 Код: program winsock_server; //Простейшее приложение-сервер. //Сокеты работают в блокирующем режиме. //На каждое соединение создается отдельный поток. {$apptype console} uses sysutils, winsock, windows; var vwsadata : twsadata; vlistensocket,vsocket : tsocket; vsockaddr : tsockaddr; trid : thandle; const cport = word(33); csigexit = 'q'; //Процедура отдельного потока для каждого клиента. procedure socketthread; var sockname : tsockaddr; abuf : array of char; vbuf : string; vsize : integer; s :tsocket; bufsize : integer; begin s := vsocket; if s = invalid_socket then exit; vsize := sizeof(tsockaddr); getpeername(s, sockname, vsize); writeln(format('client accepted, remote address [%s].',[inet_ntoa (sockname.sin_addr)])); //Определяем размер буфера чтения для сокета vsize := sizeof(bufsize); getsockopt(s,sol_socket,so_rcvbuf,pchar(@ bufsize),vsize); writeln(format('receive buffer size [%d]',[bufsize])); setlength(abuf,bufsize); repeat //Получаем данные. Процедура работает в блокирующем режиме, //таким образом следующая строка кода не получит управление, //пока не поступят данные от клиента. vsize := recv(s,abuf[0],bufsize,0); if vsize<=0 then break; setlength(vbuf,vsize); lstrcpyn(@vbuf[1],@abuf[0],vsize); writeln(format('received from cleint: %s',[vbuf])); until vbuf = 'q'; writeln(format('client disconnected, remote address [%s].',[inet_ntoa(sockname.sin_addr)])); setlength(abuf,0); closesocket(s); end; begin writeln('starting application...'); //Объявляем, что программа будет использовать windows sockets. if wsastartup($101,vwsadata)<>0 then halt(1); writeln('using windows sockets.'); //Создаем прослушивающий сокет. vlistensocket := socket(af_inet,sock_stream,ipproto_ip); writeln(format('creating socket on port [%d].',[cport])); if vlistensocket = invalid_socket then halt(1); fillchar(vsockaddr,sizeof(tsockaddr),0); vsockaddr.sin_family := af_inet; vsockaddr.sin_port := htons(cport); vsockaddr.sin_addr.s_addr := inaddr_any; writeln('binding socket...'); //Привязываем адрес и порт к сокету. if bind(vlistensocket,vsockaddr,sizeof(tsockaddr)) <> 0 then halt(1); //Начинаем прослушивать. if listen(vlistensocket,somaxconn) <> 0 then halt(1); writeln('socket status: listening.'); repeat //Ожидаем подключения. vsocket := accept(vlistensocket,nil,nil); //Клиент подключился, запускаем новый процесс на соединение. createthread(nil,0,@socketthread,0,0,trid); until false; closesocket(vlistensocket); wsacleanup; end. | Код: {$apptype console} uses sysutils, winsock; const cport = 33; csigexit = 'q'; var vwsadata : twsadata; vsocket : tsocket; vsockaddr : tsockaddr; buf : string; begin if wsastartup($101,vwsadata)<>0 then halt(1); vsocket := socket(af_inet,sock_stream,ipproto_ip); if vsocket = invalid_socket then halt(1); fillchar(vsockaddr,sizeof(tsockaddr),0); vsockaddr.sin_family := af_inet; vsockaddr.sin_port := htons(cport); vsockaddr.sin_addr.s_addr := inet_addr('127.0.0.1'); if connect(vsocket,vsockaddr,sizeof(tsockaddr)) = socket_error then halt(1); repeat readln(buf); if send(vsocket,buf[1],length(buf),0) = socket_error then break; until buf = csigexit; closesocket(vsocket); wsacleanup; end. | тоесть есть сервер, и есть клиент. при отправке сообщения от клиента оно выводится в консоле на сервере. вопрос.. как можно эту консоль перегнать в обычное приложение с формой? я попробывал код с серверного скрипта загнать в функу онклик на буттон, назвав ее Start. дошел до Код: //Начинаем прослушивать. repeat //Ожидаем подключения. vsocket := accept(vlistensocket,nil,nil); //Клиент подключился, запускаем новый процесс на соединение. createthread(nil,0,@socketthread,0,0,trid); until false; closesocket(vlistensocket); wsacleanup; | и оно просто подвисает.. можно ли его сделать что бы оно обрабатывалось без кнопки? просто если я вместо writeln тупо вставляю Obj.Caption оно начинает ругатся на то что не знает что такое Obj
| Всего записей: 382 | Зарегистр. 21-06-2005 | Отправлено: 09:19 04-12-2009 | Исправлено: Delta RuBoard, 09:29 04-12-2009 |
|