Jak pisać zaawansowane progamy np.komunikatory?
Jestem początkującym programistą umiem podstawy C i C++(wcześniej uczyłem się pisać aplikacje internetowe i umiem HTML, CSS, PHP i MySQL i roche JS). Ale nie wiem gdzie moge się nauczyć pisać zaawansowane aplikacje tekie jak komunikatory cz inne...
Nie wiem w jakim to języku pisać i jakich trzeba do tego bibliotek?
(Mam WinXP i VC++, niedługo Linuxa:))
noo do komunikatorka WinSocketów;-)
I co dalej? Jak to pisać możecie podać jskieś najlepiej Polskie adresy stron lub kusów gdzie można się tego nauczyć?
zanim zaczniesz pisac zaawansowane programy to naucz sie najpierw pisac te proste. Wszystko musi nastapic w swoim czasie i swojej kolejnosci.
No ale umiem podstawy i troche w API i openGLu!
No Api znam dosyć dobrze chociż jest trudne dosyć...
A czego twoim zdanie mam się teraz uczyć?
No ja bym sie sprzeczał czy komunikator internetowy to skomplikowany program ale aby to chodzilo to sockety trza znac :P i to w sumie wystarczy to napisania protokołów a co do wygladu aplikacji to sie winapi kłania....
Jak pisać zaawansowane progamy np.komunikatory?...
Na klawiaturze?? :|
A dzinki wszystkim już wchodze na micrososta i się ucze !!!
Adiju! [browar]
No ale umiem podstawy i troche w API i openGLu!
No Api znam dosyć dobrze chociż jest trudne dosyć...
A czego twoim zdanie mam się teraz uczyć?
skoro założyłeś ten temat to znaczy że jeszcze tego poziomu nie osiągnąłeś zeby pisac komunikator lub jakis bardziej skomplikowany program:-) Pokombinuj sobie jakies mniejsze programy w builderze lub visualu az w koncu sam poczujesz ze juz umialbys napisac bardziej skomplikowany:)
Wtedy zadawac bedziesz konkretne pytania a nie "jak napisac komunikator?" :d
Poczytaj sobie kursy winsock'a, pokombinuj najpierw z najprostszym chatem, zapoznaj sie z builderem lub visualem.
Powodzenia [cya]
Może mi ktoś przesłać kod źródłowy programu napisanego w winsocku....
poszukaj, a pozniej pros i pytaj. wpisz sobie www.google.pl podaj winsock i ciesz sie wynikami...
ps. zalamuje rece czasami
:-( dzisiaj złamałem palca...
mam kod serva i klienta.
serv
// Nazwa modułu: Server.c
//
// Opis:
// Prosta aplikacja serwera TCP, akceptująca nachodzące
// połączenia klientów. Po ustanowieniu połączenia
// uruchamiany jest wątek odczytujący dane przesłane przez
// klienta i odsyłający je z powrotem (o ile opcja odsyłania
// nie jest wyłączona).
//
// Kompilacja:
// cl -o Server Server.c ws2_32.lib
//
// Opcje wiersza poleceń:
// server [-p:x] [-i:IP] [-o]
// -p:x Numer nasłuchującego portu
// -i:str Nasłuchujący interfejs
// -o Tylko odbiór, bez odsyłania
//
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 4096
int iPort = DEFAULT_PORT; // Port nasłuchujący klientów
BOOL bInterface = FALSE, // Nasłuchujący interfejs
bRecvOnly = FALSE; // Tylko odbiór, bez odsyłania
char szAddress[128]; // Interfejs nasłuchujący klientów
//
// Funkcja: usage
//
// Opis:
// Wydruk informacji o działaniu programu
//
void usage()
{
printf("użycie: server [-p:x] [-i:IP] [-o]\n\n");
printf(" -p:x Numer nasłuchującego portu on\n");
printf(" -i:str Nasłuchujący interfejs on\n");
printf(" -o Tylko odbiór, bez odsyłania\n\n");
ExitProcess(1);
}
//
// Funkcja: ValidateArgs
//
// Opis:
// Analiza argumentów wiersza poleceń i ustalenie wartości
// niektórych znaczników globalnych, decydujących o wykonaniu
// określonych czynności.
//
void ValidateArgs(int argc, char **argv)
{
int i;
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'p':
iPort = atoi(&argv[i][3]);
break;
case 'i':
bInterface = TRUE;
if (strlen(argv[i]) > 3)
strcpy(szAddress, &argv[i][3]);
break;
case 'o':
bRecvOnly = TRUE;
break;
default:
usage();
break;
}
}
}
}
//
// Funkcja: ClientThread
//
// Opis:
// Ta funkcja jest wywoływana w postaci wątku obsługującego
// dane połączenie klienta. Przekazany parametr jest uchwytem
// gniazda zwróconym przez wywołanie funkcji accept(). Ta
// funkcja czyta dane nadesłane przez klienta i odsyła je
// z powrotem.
//
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock=(SOCKET)lpParam;
char szBuff[DEFAULT_BUFFER];
int ret,
nLeft,
idx;
while(1)
{
// Wykonanie blokującej funkcji recv ()
//
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
if (ret == 0) // Zamknięcie uzgodnione
break;
else if (ret == SOCKET_ERROR)
{
printf("Funkcja recv() zakończona błędem: %d\n",
WSAGetLastError());
break;
}
szBuff[ret] = '\0';
printf("ODBIÓR: '%s'\n", szBuff);
//
// Odesłanie danych (jeżeli wybrano tę opcję).
//
if (!bRecvOnly)
{
nLeft = ret;
idx = 0;
//
// Sprawdzenie, czy zapisaliśmy wszystkie dane
//
while(nLeft > 0)
{
ret = send(sock, &szBuff[idx], nLeft, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("Funkcja send() zakończona"
" błędem: %d\n",
WSAGetLastError());
break;
}
nLeft -= ret;
idx += ret;
}
}
}
return 0;
}
//
// Funkcja: main
//
// Opis:
// Wątek główny. Inicjacja interfejsu Winsock, analiza
// argumentów wiersza poleceń, utworzenie nasłuchującego
// gniazda, związanie go z adresem lokalnym i oczekiwanie
// na połączenia klientów.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET sListen,
sClient;
int iAddrSize;
HANDLE hThread;
DWORD dwThreadId;
struct sockaddr_in local,
client;
ValidateArgs(argc, argv);
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Nie można wczytać biblioteki Winsock!\n");
return 1;
}
// Utworzenie nasłuchującego gniazda
//
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen == SOCKET_ERROR)
{
printf("Funckja socket() zakończona błędem: %d\n",
WSAGetLastError());
return 1;
}
// Wybór lokalnego interfejsu, z którym zostanie
// związane gniazdo
//
if (bInterface)
{
local.sin_addr.s_addr = inet_addr(szAddress);
if (local.sin_addr.s_addr == INADDR_NONE)
usage();
}
else
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(iPort);
if (bind(sListen, (struct sockaddr *)&local,
sizeof(local)) == SOCKET_ERROR)
{
printf("Funkcja bind() zakończona błędem: %d\n",
WSAGetLastError());
return 1;
}
listen(sListen, 8);
//
// Oczekiwanie na żądania klientów w ciągłej pętli. Po
// wykryciu próby połączenia, utworzenie wątku i przekazanie
// jego uchwytu.
//
while (1)
{
iAddrSize = sizeof(client);
sClient = accept(sListen, (struct sockaddr *)&client,
&iAddrSize);
if (sClient == INVALID_SOCKET)
{
printf("Funkcja accept() zakończona błędem: %d\n",
WSAGetLastError());
break;
}
printf("Zaakceptowano klienta: %s:%d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient, 0, &dwThreadId);
if (hThread == NULL)
{
printf("Funkcja CreateThread() zakończona błędem: %d\n",
GetLastError());
break;
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}
i nie wiem gdzie adresy wpisać(wkurza mnie to bo jest jakoś inaczej niż w kursie którym czytałem)
klient
// Nazwa modułu: Client.c
//
// Opis:
// Przykładowa aplikacja klienta powtarzającego. Klient ten łączy
// się z serwerem TCP, wysyła dane i odczytuje dane odesłane
// przez serwer.
//
// Kompilacja:
// cl -o Client Client.c ws2_32.lib
//
// Opcje wiersza poleceń:
// client [-p:x] [-s:IP] [-n:x] [-o]
// -p:x Numer odległego portu
// -s:IP Adres IP serwera lub nazwa węzła
// -n:x Liczba wysyłanych wiadomości
// -o Tylko wysyłanie, bez odbioru
//
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define DEFAULT_COUNT 20
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 2048
#define DEFAULT_MESSAGE "To jest test systemu komunikacji \
ratunkowej"
char szServer[128], // Serwer, z którym się łączymy
szMessage[1024]; // Wysyłana wiadomość
int iPort = DEFAULT_PORT; // Numer portu serwera
DWORD dwCount = DEFAULT_COUNT; // Ilość nadań wiadomości
BOOL bSendOnly = FALSE; // Tylko nadawanie, bez odbioru
//
// Funkcja: usage:
//
// Opis:
// Wydruk informacji o działaniu programu
//
void usage()
{
printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n");
printf(" -p:x Numer odległego portu\n");
printf(" -s:IP Adres IP serwera lub nazwa stacji\n");
printf(" -n:x Ilość nadań wiadomości\n");
printf(" -o Tylko nadawanie, bez odbioru\n");
ExitProcess(1);
}
//
// Funkcja: ValidateArgs
//
// Opis:
// Analiza argumentów wiersza poleceń i ustalenie wartości
// niektórych znaczników globalnych, decydujących o wykonaniu
// określonych czynności.
//
void ValidateArgs(int argc, char **argv)
{
int i;
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'p': // Odległy port
if (strlen(argv[i]) > 3)
iPort = atoi(&argv[i][3]);
break;
case 's': // Serwer
if (strlen(argv[i]) > 3)
strcpy(szServer, &argv[i][3]);
break;
case 'n': // Liczba nadań wiadomości
if (strlen(argv[i]) > 3)
dwCount = atol(&argv[i][3]);
break;
case 'o': // Tylko nadawanie, bez odbioru
bSendOnly = TRUE;
break;
default:
usage();
break;
}
}
}
}
//
// Funkcja: main
//
// Opis:
// Wątek główny. Inicjacja interfejsu Winsock, analiza
// argumentów wiersza poleceń, tworzenie gniazda, połączenie
// z serwerem, a następnie wysyłanie i odbieranie danych.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET sClient;
char szBuffer[DEFAULT_BUFFER];
int ret,
i;
struct sockaddr_in server;
struct hostent *host = NULL;
// Analiza wiersza poleceń i wczytanie biblioteki Winsock
//
ValidateArgs(argc, argv);
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Nie można wczytać biblioteki Winsock!\n");
return 1;
}
strcpy(szMessage, DEFAULT_MESSAGE);
//
// Utworzenie gniazda i próba połączenia się z serwerem
//
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
printf("Funkcja socket() zakończona błędem: %d\n",
WSAGetLastError());
return 1;
}
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr(szServer);
//
// Jeżeli podany adres serwera nie ma postaci
// "aaa.bbb.ccc.ddd" jest to wówczas nazwa węzła,
// więc należy ją odwzorować
//
//
if (server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(szServer);
if (host == NULL)
{
printf("Nie udało się odwzorować adresu"
" serwera: %s\n", szServer);
return 1;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0],
host->h_length);
}
if (connect(sClient, (struct sockaddr *)&server,
sizeof(server)) == SOCKET_ERROR)
{
printf("Funkcja connect() zakończona błędem: %d\n",
WSAGetLastError());
return 1;
}
// Wysyłanie i odbiór danych
//
for(i = 0; i < dwCount; i++)
{
ret = send(sClient, szMessage, strlen(szMessage), 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("Funkcja send() zakończona błędem: %d\n",
WSAGetLastError());
break;
}
printf("Wysłano %d bajtów\n", ret);
if (!bSendOnly)
{
ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
if (ret == 0) // Zamknięcie uzgodnione
break;
else if (ret == SOCKET_ERROR)
{
printf("Funkcja recv() zakończona błędem: %d\n",
WSAGetLastError());
break;
}
szBuffer[ret] = '\0';
printf("ODBIÓR [%d bajtów]: '%s'\n", ret, szBuffer);
}
}
getch();
closesocket(sClient);
WSACleanup();
return 0;
}