Пишу чо-то типа проги для посылки сообщения от клиента к серверу и наоборот. Клиент вводит Хост или IP сервера и соединяется с ним. Проблема в том, что на одном компе всё работает а вот если на разных то чо-то не получается!!!!! Если у кого-то есть свой вариант то выкладывайте – буду признателен!!!!
Использую ClientSocket1и ServerSocket1.
Исходник:
//—————————————————————————
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//—————————————————————————
void __fastcall TForm1::Button1Click(TObject *Sender) //прослушивание серваком
{
ClientSocket1->Active=false;
ServerSocket1->Active=true;
StatusBar1->SimpleText="Идёт прослушивание сервером запросов от клиентов";
}
//—————————————————————————
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (ClientSocket1->Active) ClientSocket1->Active=false;
InputQuery("Ввод данных для связи с сервером","Введите имя сервера (или вашего компьютера)",ClientSocket1->Host);
//Host не меняется
if (ClientSocket1->Host!="")
{
ClientSocket1->Active=true;
StatusBar1->SimpleText="Соединение установлено";
Caption=ClientSocket1->Host;
}
}
//—————————————————————————
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClientSocket1->Close();
ServerSocket1->Close();
StatusBar1->SimpleText="Соединение разорвано";
}
//—————————————————————————
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Form1->Close();
}
//—————————————————————————
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
StatusBar1->SimpleText="Данные получены от сервера клиентом";
}
//—————————————————————————
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
StatusBar1->SimpleText="Данные получены от клиента сервером";
}
//—————————————————————————
void __fastcall TForm1::Button5Click(TObject *Sender)
{
ClientSocket1->Socket->SendText(Memo2->Lines->Strings[Memo2->Lines->Count-1]);
}
//—————————————————————————
void __fastcall TForm1::Button6Click(TObject *Sender)
{
String s=Memo1->Lines->Strings[Memo1->Lines->Count-1];
ServerSocket1->Socket->Connections[0]->SendText(s);
}
//—————————————————————————
void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
if (ErrorCode==1110) ShowMessage("Не правильно введён адрес!");
ErrorCode=0;
}
//—————————————————————————
void __fastcall TForm1::Button7Click(TObject *Sender) //другая кнопка соединения – первая не работала
{
if (ClientSocket1->Active) ClientSocket1->Active=false;
Cl
23 августа 2008 в 15:03
Да – порт – 1024
23 августа 2008 в 15:03
В качестве хоста – имя компа – на моём пашет(ввожу свой хост)…
А ну да пардон, чо-то глюкануло
void __fastcall TForm1::Button7Click(TObject *Sender)
{
if (ClientSocket1->Active) ClientSocket1->Active=false;
ClientSocket1->Host=Edit1->Text;
if (ClientSocket1->Host!="")
{
ClientSocket1->Active=true;
StatusBar1->SimpleText="Соединение установлено";
Caption=ClientSocket1->Host;
}
}
//—————————————————————————
23 августа 2008 в 2:05
1. У тебя не весь код в пост влез
2. Что вводишь в качестве хоста при удалённом соединении?
3. И что вводишь при локальном использовании?
22 августа 2008 в 22:03
Лень вдаваться в подробности, но первым делом следует проверить что подключение возможно и в других программах (не скайп или icq – они умеют обходить прокси или нат, и вообще говоря работают с централизованым сервером) а например telnet client/server
22 августа 2008 в 21:02
Вадим, а номер порта на клиенте и сервере одинаковый ставите и больше 1000?
22 августа 2008 в 20:04
тоже писал прогу-мессенджер, только на API и на Дельфях
вот отталкивался от этого кода (взято хз откуда, вероятно с ДельфиВорлд). работает пудово и с одного, и с разных компов))
//клиент
program winsock_client;
{$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('1.1.168.92');
if connect(vsocket,vsockaddr,sizeof(tsockaddr)) = socket_error then halt(1);
repeat
readln(buf);
if send(vsocket,buf[1],length(buf)+1,0) = socket_error then break;
until buf = csigexit;
closesocket(vsocket);
wsacleanup;
readln;
end.
//сервер
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.