Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с сокетами

35K
23 июля 2008 года
Gviber
3 / / 16.03.2008
Всем привет, пытаюсь писать приложение клиент/сервер и тут начались проблемы, клиент может подключится к серверу, а может прервать соединение (при этом посылает сообщение серверу, что он отключается), подключится получается только два раза, на второй раз при попытки отключится сервер выдает ошибку (не знаю в чем проблема уже все перепробовал)

Клиент:
Код:
#include <Winsock2.h>
#include <stdio.h>
#include "Windows.h"
struct sockaddr_in peer;
SOCKET s;
char buf_send[1024];
char buf_rec[1024];

DWORD WINAPI rec_funct(LPVOID)
{
  AnsiString str;
  while(1)
  {
   recv(s,buf_rec,sizeof(buf_rec),0);
   if(strlen(buf_rec))
   {
     str = buf_rec;
     str = "Server: "+str;
     Form1->RichEdit1->Lines->Add(str);
          buf_rec[0]='\0';
   }
   Sleep(1000);
  }
}
//отключится
void disconnect (void)
{
  strcpy(buf_send,"%D");
  send(s,buf_send,sizeof(buf_send),0);
  WSACleanup();
}

//подключится к серверу или отключится
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if (Button1->Tag==0)
   {
      Button1->Tag=1;
      Button1->Caption="Disconnect";

      WSADATA wsaData;
      WSAStartup(MAKEWORD(2,2), &wsaData);
      s = SOCKET_ERROR;
      peer.sin_family = AF_INET;
      peer.sin_port = htons(7070);
      peer.sin_addr.s_addr= inet_addr("127.0.0.1");

      s = socket(AF_INET, SOCK_STREAM,0);
      if(s == INVALID_SOCKET) ShowMessage(WSAGetLastError());
      else
      {
    if(connect(s,(sockaddr*)&peer,sizeof(peer)))
            RichEdit1->Lines->Add("Failed to connect");
         else
         {
            RichEdit1->Lines->Add("Успешно подключился к серверу...");
       CreateThread(NULL,0,rec_funct,NULL,0,NULL);
         }

      }
   }
   else
   {
     Button1->Tag=0;
     Button1->Caption="Connect";
     disconnect();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   strcpy(buf_send,Edit1->Text.c_str());
   send(s,buf_send,sizeof(buf_send),0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   RichEdit1->Text="";
   Edit1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   disconnect();
}
//---------------------------------------------------------------------------


Сервер:
Код:
#include "Winsock2.h"
#include "Ws2tcpip.h"
struct sockaddr_in peer;
SOCKET s;
SOCKET s1;
int rc;
char buf_send[1024];
char buf_rec[1024];

//принять строку
DWORD WINAPI rec_funct(LPVOID)
{
  AnsiString str;
  while(1)
  {
   recv(s1,buf_rec,sizeof(buf_rec),0);
   if(strlen(buf_rec))
   {
     str = buf_rec;
          if (str=="%D")
          {
            Form1->RichEdit1->Lines->Add("Клиент отключился");
            Form1->Button1->Click();
          }
          else
          {
       str = "Client: "+str;
       Form1->RichEdit1->Lines->Add(str);
          }
          buf_rec[0]='\0';
   }
   Sleep(1000);
  }
}
//ожидаем подключения
DWORD WINAPI accept_funct(LPVOID)
{
    Form1->RichEdit1->Lines->Add("Waiting for client to connect...");
   while( s1 == SOCKET_ERROR )
   {
     s1 = accept( s, NULL, NULL );
     Sleep(1000);

   }
   CreateThread(NULL,0,rec_funct,NULL,0,NULL);
   Form1->RichEdit1->Lines->Add("Client connected");
  return 0;
}
//Включить сервер
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   WSACleanup();
   WSADATA wsaData;
   WSAStartup(MAKEWORD(2,2), &wsaData);
   s = SOCKET_ERROR;
   s1 = SOCKET_ERROR;

   peer.sin_family = AF_INET;
   peer.sin_port = htons(7070);
   peer.sin_addr.s_addr= htonl(INADDR_ANY);

   s = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
   if(s == SOCKET_ERROR)
   {
    ShowMessage(gai_strerror(WSAGetLastError()));
   }
   else
   {
    if(bind(s,(sockaddr*)&peer,sizeof(peer)) == SOCKET_ERROR)
    {
       ShowMessage("Failed to connect");
    }
         else
         {
       listen(s,5);
       CreateThread(NULL,0,accept_funct,NULL,0,NULL);
         }
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   RichEdit1->Text="";
   Edit1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  WSACleanup();
}
//---------------------------------------------------------------------------
//Отправить сообщение
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  strcpy(buf_send,Edit1->Text.c_str());
  send(s1,buf_send,sizeof(buf_send),0);
}
//---------------------------------------------------------------------------
11
23 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
а бесконечный цикл в потоке тормозишь?
я б сделал не while(true)
а while(!stop)
где stop - внешняя переменная типа bool
35K
23 июля 2008 года
Gviber
3 / / 16.03.2008
Цитата: oxotnik333
а бесконечный цикл в потоке тормозишь?
я б сделал не while(true)
а while(!stop)
где stop - внешняя переменная типа bool


Помоглло :) спсб!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог