singlepost

Чуваки помогите с C++ Builder, please!!! << На главную или назад  

Пишу чо-то типа проги для посылки сообщения от клиента к серверу и наоборот. Клиент вводит Хост или 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

42 ответов в теме “Чуваки помогите с C++ Builder, please!!!”

  1. 6
    Вадик Карелин ответил:

    Да – порт – 1024

  2. 5
    Вадик Карелин ответил:

    В качестве хоста – имя компа – на моём пашет(ввожу свой хост)…
    А ну да пардон, чо-то глюкануло

    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;
    }

    }
    //—————————————————————————

  3. 4
    Константин Смотритель ответил:

    1. У тебя не весь код в пост влез
    2. Что вводишь в качестве хоста при удалённом соединении?
    3. И что вводишь при локальном использовании?

  4. 3
    Ростислав Чутков ответил:

    Лень вдаваться в подробности, но первым делом следует проверить что подключение возможно и в других программах (не скайп или icq – они умеют обходить прокси или нат, и вообще говоря работают с централизованым сервером) а например telnet client/server

  5. 2
    Дмитрий Марков ответил:

    Вадим, а номер порта на клиенте и сервере одинаковый ставите и больше 1000?

  6. 1
    Артем Валиев ответил:

    тоже писал прогу-мессенджер, только на 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.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.