Показать сообщение отдельно

  #9  
Старый 04.02.2009, 21:29
zindi
Участник форума
Регистрация: 11.04.2007
Сообщений: 219
Провел на форуме:
982101

Репутация: 13
По умолчанию

когда то писал,пример на сокетах мини чата.
Цитата:
#include <iostream>
#include <process.h>
#include <winsock2.h>
#include "chat.h"
using namespace std;

#pragma comment(lib, "ws2_32.lib")

void StartWinSock();
void StopWinSock();

void chat_server();
void chat_client_thread(void *pv);

int exit_chat_server;
CRITICAL_SECTION cs;

int main()
{
StartWinSock();//ініціалізація

exit_chat_server = 0;
chat_server();

StopWinSock();//закриваємо все

return 0;
}
//-----------------------------------------
void StopWinSock()
{
if (WSACleanup())
cout<<"Error Cleapir"<<endl;
else
cout<<"Cleapir Good !!!!!"<<endl;
}

void StartWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData))
{
cout<<"winsock not bi initialized !"<<endl;
WSACleanup();
}
else
cout<<"Winsock initial OK !!!!"<<endl;
}
//-----------------------------------------
void chat_server()
{
//----- отримуємо адресу хоста -----------------------------------
char local_host[255];
gethostname(local_host, 255);

sockaddr_in clientAddr;
in_addr local_ip = *((in_addr *)gethostbyname(local_host)->h_addr);

clientAddr.sin_family = AF_INET;
clientAddr.sin_addr = local_ip;
clientAddr.sin_port = htons(CHAT_PORT);
cout<<"starting server on "<<inet_ntoa(local_ip)<<endl;

// --------------- ініціалізуємо критичну секцію ---------------
InitializeCriticalSection(&cs);
//---------- створюємо сокет -------------------------------------
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

//---------------- ми сервер, зєднуємо сокет з портом --------------
bind(server_socket, (sockaddr*) &clientAddr, sizeof(clientAddr));

//----------------- переводимо сокет в режим очікування -------------------
listen(server_socket, CHAT_BACKLOG);

while(exit_chat_server == 0)
{
cout<<"waiting for connection..."<<endl;
fflush(stdout);

//------------- створюємо новий сокет для клієнта і приєднуємо його ---------
int clientAddrlength = sizeof(clientAddr);

SOCKET client_socket = accept(server_socket, (sockaddr*) &clientAddr, &clientAddrlength);

cout<<"client connected: "<<inet_ntoa(clientAddr.sin_addr)<<endl;
fflush(stdout);

//запускаємо потік для клієнта
_beginthread(chat_client_thread, 0, (void*)client_socket);
}
}
void chat_client_thread(void *pv)
{
SOCKET s = (SOCKET)pv;
int client_exit = 0;

chat_login_data login_data; //обєкт структури chat_login_data з chat.h
//отримати дані з приєднаного сокета
recv(s, (char*) &login_data, sizeof(login_data), 0);

chat_message msg; //обєкт структури chat_message з chat.h
cout<<login_data.login<<" entered chat"<<endl;

while(client_exit == 0 && !exit_chat_server)
{
if(recv(s, (char*)&msg, sizeof(msg), 0)<=0)
{
cout<<login_data.login<<" sent invalid message"<<endl;
client_exit = 1;
break;
} else {
EnterCriticalSection(&cs);
cout<<login_data.login<<": "<<msg.text<<endl;
fflush(stdout);
LeaveCriticalSection(&cs);
}
}
}
Цитата:
#define CHAT_MAXMSG 512
#define CHAT_PORT 1234
#define CHAT_BACKLOG 10

struct chat_login_data
{
char login[255];
char password[255];
};

struct chat_message
{
char to_login[255];
char text[CHAT_MAXMSG];
};
 
Ответить с цитированием