
04.02.2009, 21:29
|
|
Участник форума
Регистрация: 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];
};
|
|
|