Помогите исправить ошибку в отправки сообщения. Клиент после подключения должен оправить Privet. Но после присоединения, клиент зависает.
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "winsock2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
SOCKET S,S1;
struct sockaddr_in SSA;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Этап №1 Подключение библиотеки
WSADATA MyWSAData;
int ErrWSADATA;
if (WSAStartup(MAKEWORD(2,0), &MyWSAData)!=0)
{
Memo1->Lines->Add("Ошибка в библиотеки");
}
else
{
Memo1->Lines->Add("Библиотека Работает");
//Этап №2 Создание сокета
S=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (S==INVALID_SOCKET) Memo1->Lines->Add("Ошибка в Сокете");
else Memo1->Lines->Add("Сокет создан");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Этап №3 Привязка адреса к сокету (Создание сервера)
//struct sockaddr_in SSA;
SSA.sin_family=AF_INET;
SSA.sin_port=htons(2000);
SSA.sin_addr.s_addr=INADDR_ANY;
int ErrBind;
ErrBind=bind(S,(LPSOCKADDR)&SSA,sizeof(SSA));
if (ErrBind!=0) Memo1->Lines->Add("Ошибка в привязке адреса");
else
{
Memo1->Lines->Add("Привязка адреса");
int P;
P=listen(S, SOMAXCONN);//Сервер ожидает подключения клиента.
if (P!=0) Memo1->Lines->Add("Ошибка в Listen");
else
{
//int p;
Memo1->Lines->Add("Listen работает");
S1=accept(S,NULL, NULL);
if (S1==INVALID_SOCKET) Memo1->Lines->Add("Клиент не присоединился");
else Memo1->Lines->Add("Клиент присоединился");
char A[50];
while (recv(S,A,sizeof(A),0)!=SOCKET_ERROR)
{
Memo1->Lines->Add(A);
send(S1,A,sizeof(A),MSG_DONTROUTE);
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
struct sockaddr_in SSA;
SSA.sin_family=AF_INET;
SSA.sin_port=htons(2000);
SSA.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
Memo1->Lines->Add("Привязка адреса");
int ErrCon;
ErrCon=connect(S, (struct sockaddr*)&SSA,sizeof(struct sockaddr));
if (ErrCon!=0) Memo1->Lines->Add("Не могу соединиться с сервером");
else
{
Memo1->Lines->Add("соединился с сервером");
char A[50];
send(S,"Privet",sizeof("Privet"),MSG_DONTROUTE);
while (recv(S,A,sizeof(A),0)!=SOCKET_ERROR)
{
Memo1->Lines->Add(A);
send(S1,A,sizeof(A),MSG_DONTROUTE);
}
}
}
//---------------------------------------------------------------------------