Witam. Jak można napisać taki program typu chat?? Chciałbym coś takiego napisać w C++. Mogło by to działać tylko na 2 PC w sieci LAN. Możecie mi coś podpowiedzieć jak to zrobić?? jest to trudne?(mam nawet duże pojęcie o c++ winapi).pozdrawiam.
słowo klucz: sockety
Jeśli to ma być prosta wymiana komunikatów to jest to raczej proste. Wystarczy że opanujesz
socket(), bind(), sendto() / send(), recvfrom() / recv() (+ ewentualnie listen(), connect(), accept() w zależności od tego czy chcesz mieć tryb bezpołączeniowy czy połączeniowy).
Chciałbym Aby to było w jak najprostszej postaci w sieci przewodowej. Pozdrawiam.
Rozumiem że liczysz na przykładowe kody? ;]
http://student.agh.edu.pl/~pstanisl/sockety.TXT
tu masz referat na temat socketów (mam nadzieję ze autor sie nie obrazi :) ) wraz z przykładowymi kodami do niego.
A mogę pisać to w kompilatorze Dev c++ czy potrzeba jakiś inny??
Teoretycznie możesz, ale polecam użyc czegoś nowszego. Poza tym link który podałem mówi o socketach pod unixy (chociaż różnice są niewielkie).
Mam nadizeję zę pod windows będzie działać bez zmian w kodzie. pozdrawiam.
:: napisał(a)
Mam nadizeję zę pod windows będzie działać bez zmian w kodzie. pozdrawiam.
Nie, nie bedzie dzialac bez zmian w kodzie. Trzeba sie troche wysilic i poszukac roznic, a jak bedzie problem zglosic sie na forum.
Mniej wiecej takie cos dochodzi i inkludy sa inne:
#include <winsock2.h>
#include <windows.h>
int main(void)
{
WSADATA wsaData;
SOCKET sock;
if(!WSAStartup(MAKEWORD(2,0), &wsadata)) { printf("error\n"); }
return 0;
}
Po tym mozesz sobie uzywac juz tych funkcji uniksowych oraz nalezy pamietac o podlinkowaniu ws2_32.lib
mała uwaga Dev C++ to nie kompilator
A mogę pisać to w kompilatorze Dev c++ czy potrzeba jakiś inny??
tylko IDE
Mam taki programik
Main.cpp
#include <iostream>
#include "Socket.h"
using namespace std;
int main()
{
int choice;
int port = 666;
//char *ipAddress = "127.0.0.1";
string ipAddress;
bool done = false;
char recMessage[STRLEN];
char sendMessage[STRLEN];
cout<<"\t\t1) server"<<endl;
cout<<"\t\t2) dolocz"<<endl;
cout<<"\t\t3) spier"<<endl;
cin>>choice;
if ( choice == 3 )
exit(0);
else if ( choice == 2 )
{
//Client
cout<<"wpiszIP adres, 127.0.0.1"<<endl;
cin>>ipAddress;
ClientSocket sockClient;
cout<<"loczenie.."<<endl;
sockClient.ConnectToServer( ipAddress.c_str(), port );
//Connected
while ( !done )
{
sockClient.GetAndSendMessage();
cout<<"\t--czekaj--"<<endl;
sockClient.RecvData( recMessage, STRLEN );
cout<<"ja > "<<recMessage<<endl;
if ( strcmp( recMessage, "end" ) == 0 ||
strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
sockClient.CloseConnection();
}
else if ( choice == 1 )
{
//SERVER
ServerSocket sockServer;
cout<<"czekajnahostq..."<<endl;
sockServer.StartHosting( port );
//Connected
while ( !done )
{
cout<<"\t--czekaj--";
sockServer.RecvData( recMessage, STRLEN );
cout<<"on > "<<recMessage<<endl;
sockServer.GetAndSendMessage();
if ( strcmp( recMessage, "end" ) == 0 ||
strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
}
}
Socket.cpp
#include "Socket.h"
Socket::Socket()
{
if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
{
cerr<<"error\n";
system("pause");
WSACleanup();
exit(10);
}
//Create a socket
mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( mySocket == INVALID_SOCKET )
{
cerr<<"Srrror"<<endl;
system("pause");
WSACleanup();
exit(11);
}
myBackup = mySocket;
}
Socket::~Socket()
{
WSACleanup();
}
bool Socket::SendData( char *buffer )
{
send( mySocket, buffer, strlen( buffer ), 0 );
return true;
}
bool Socket::RecvData( char *buffer, int size )
{
int i = recv( mySocket, buffer, size, 0 );
buffer[i] = '\0';
return true;
}
void Socket::CloseConnection()
{
//cout<<"CLOSE CONNECTION"<<endl;
closesocket( mySocket );
mySocket = myBackup;
}
void Socket::GetAndSendMessage()
{
char message[STRLEN];
cin.ignore();//without this, it gets the return char from the last cin and ignores the following one!
cout<<"psz > ";
cin.get( message, STRLEN );
SendData( message );
}
void ServerSocket::StartHosting( int port )
{
Bind( port );
Listen();
}
void ServerSocket::Listen()
{
//cout<<"LISTEN FOR CLIENT..."<<endl;
if ( listen ( mySocket, 1 ) == SOCKET_ERROR )
{
cerr<<"error\n";
system("pause");
WSACleanup();
exit(15);
}
//cout<<"ACCEPT CONNECTION..."<<endl;
acceptSocket = accept( myBackup, NULL, NULL );
while ( acceptSocket == SOCKET_ERROR )
{
acceptSocket = accept( myBackup, NULL, NULL );
}
mySocket = acceptSocket;
}
void ServerSocket::Bind( int port )
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" );
myAddress.sin_port = htons( port );
//cout<<"BIND TO PORT "<<port<<endl;
if ( bind ( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress) ) == SOCKET_ERROR )
{
cerr<<"error\n";
system("pause");
WSACleanup();
exit(14);
}
}
void ClientSocket::ConnectToServer( const char *ipAddress, int port )
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr( ipAddress );
myAddress.sin_port = htons( port );
//cout<<"CONNECTED"<<endl;
if ( connect( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress ) ) == SOCKET_ERROR )
{
cerr<<"error klient\n";
system("pause");
WSACleanup();
exit(13);
}
}
Socket.h
#pragma once
#include <iostream>
#include "WinSock2.h"
using namespace std;
const int STRLEN = 256;
class Socket
{
protected:
WSADATA wsaData;
SOCKET mySocket;
SOCKET myBackup;
SOCKET acceptSocket;
sockaddr_in myAddress;
public:
Socket();
~Socket();
bool SendData( char* );
bool RecvData( char*, int );
void CloseConnection();
void GetAndSendMessage();
};
class ServerSocket : public Socket
{
public:
void Listen();
void Bind( int port );
void StartHosting( int port );
};
class ClientSocket : public Socket
{
public:
void ConnectToServer( const char *ipAddress, int port );
};
Działa:) ale czy możecie mi przetłumaczyć troszkę w miarę możliwośći? dokładniej do socketów zbliżę się jutro pozdrawia.