#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);
}
//---------------------------------------------------------------------------
#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);
}
//---------------------------------------------------------------------------
я б сделал не while(true)
а while(!stop)
где stop - внешняя переменная типа bool
Цитата: oxotnik333
а бесконечный цикл в потоке тормозишь?
я б сделал не while(true)
а while(!stop)
где stop - внешняя переменная типа bool
я б сделал не while(true)
а while(!stop)
где stop - внешняя переменная типа bool
Помоглло :) спсб!