ďťż

Ładny brzuch

Witam

Kod serwera://--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <winsock2.h> #include <windows.h> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; SOCKET nasluchujacy, polaczony; struct sockaddr_in sin; int rozmiar; struct OdbPak { char odbiorcza[250]; char nick[20]; } odbierz; String temp; HANDLE hThread; DWORD dwThreadID; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- DWORD WINAPI ClientThread(LPVOID lpParam) { SOCKET sock = (SOCKET)lpParam; while (1) { recv(polaczony,(char*)&odbierz,sizeof(odbierz),0); temp = odbierz.nick; temp += ": "; temp += odbierz.odbiorcza; Form1->RichEdit1->Lines->Add(temp); } } int __fastcall nasluch(Pointer Parameter) { while (1) { rozmiar = sizeof(sin); polaczony = accept(nasluchujacy,(struct sockaddr *)&sin, &rozmiar); SOCKADDR_IN adr; int len = 16; if (getpeername(polaczony,(SOCKADDR*) &adr,&len)==0) { HOSTENT *he = gethostbyaddr((CHAR*) &adr.sin_addr,len,AF_INET); if (he) { char* buf = new char[256]; wsprintf(buf,"Adres ip: %s, nazwa hosta: %s :)",inet_ntoa(adr.sin_addr),he->h_name); Form1->RichEdit1->Lines->Add(buf); } } hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)polaczony, 0, &dwThreadID); } } void __fastcall TForm1::Button5Click(TObject *Sender) { int blad; WORD wersja; WSADATA wsaData; wersja = MAKEWORD( 2, 0 ); blad = WSAStartup(wersja, &wsaData ); if ( blad != 0 ) { MessageBox(Handle,"error WSA","ERROR",MB_OK); WSACleanup(); } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { MessageBox(Handle,"error zła wersja winsocket","ERROR",MB_OK); WSACleanup(); } nasluchujacy = socket( AF_INET, SOCK_STREAM, 0 ); memset( &sin, 0, sizeof(sin) ); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(6666); rozmiar = sizeof(sin); if ( bind(nasluchujacy,(struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR ) { MessageBox(Handle,"bind - błąd","błąd",MB_OK); WSACleanup(); } if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR) { MessageBox(Handle,"error listen","ERROR",MB_OK); WSACleanup(); } W_ID = BeginThread(NULL, 0, nasluch, this, 0, W_PD); } //---------------------------------------------------------------------------
private: // User declarations        int W_ID;        unsigned int W_PD;

Moje pytanie brzmi jak zrobić aby w każdym wątku można było oczekiwać na przyjście wiadomości, wysać wiadomość do klienata itp. Chce aby w każdym wątku byo coś w rodzaju komunikatów np: switch (WSAGETSELECTEVENT(Msg.LParam))                {                        case FD_ACCEPT:                        break;                        case FD_READ:                        break;                        case FD_CONNECT:                        break;                        case FD_WRITE:                        break;                } Jak to zrobić? Lub napiszcie jak mam wysłać wiadomość z tego serwera do wszystkich połączonych klientów. Bo nie wiem jak się odwołać do socketa w danym wątku.
Z góry dzięki.
Użytkownik ssx edytował ten post 15 listopad 2005, 11:46
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •