Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 13:11:58 Předmět: Vícevláknový server a client - potebuji navod |
|
|
Dobry den rad bych se naucil vytvorit vicevlaknovy server a client v c++. Jenze kazdy navod a open-source ktery jsem nasel nefungoval.
Ja chapu jak to funguje ale mam problem to sestrojit. A kdyz sezenu navod udelam to presne podle nej, dopadne to tak ze to nejede.
Naposledy upravil mival dne 2. říjen 2011, 14:05:49, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 2. říjen 2011, 13:42:44 Předmět: |
|
|
Proč vícevláknový server? Na co potřebuješ ta další vlákna? _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 2. říjen 2011, 14:01:41 Předmět: |
|
|
Asi myslíš asynchroní:
kód: |
TcpListener listener;
Thread listenForClients;
void Main(string[] args)
{
listener = new TcpListener(new IPEndPoint(IPAddress.Any, 28960)); //inicializuješ TcpListenera 28960 - port - můžeš použít jinej, někde bych si našel použitelnej rozsah
listenForClients = new Thread(new ThreadStart(ListenForClients));
listenForClients.Start();
}
void ListenForClients()
{
listener.Start();
while (true)
{
TcpClient client = listener.AcceptTcpClient(); //metoda vlakno zablokuje dokud se nepřipojí klient
Thread clientThread = new Thread(new ParameterizedThreadStart(handleCom));
clientThread.Start(client); //pro klienta vytvoříš nový vlákno, použiješ parametrizedthreadstart a jako parametr hodíš klienta
}
}
void handleCom(Object o)
{
TcpClient clnt = (TcpClient)o;
NetworkStream NS = clnt.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
bytesRead = NS.Read(message, 0, 4096); //přešte zprávu ze streamu
}
catch
{
break;
}
if (bytesRead == 0)
{
break;
}
}
tady s tou zprávou něco uděláš (pro dekonování do stringu vem např UTF8encoding.UTF8.GetString(message, 0, bytesRead) - myslim že je to správně...
clnt.Close();
} |
To je taková ukázka kde vytvoříš tcpListenera a potom při příchozim spojení (listener.AcceptTcpClient() si vytvoříš klienta a pro něj nový vlákno, který ho zpracuje, je to jen takovej ukázkovej, kod, mělo by to stačit (v C#, podobně to bude i v C++)... Stačí hledat a podívat se třeba i na http://msdn.microsoft.com/en-us/library/ms123401
Naposledy upravil Vlatom dne 2. říjen 2011, 14:08:19, celkově upraveno 2 krát |
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 14:06:52 Předmět: |
|
|
to je sice pekne, ale ja potrebuji v C++. Kdyby mi stacilo C# tak uz jsem si navod nasel ale ja to nedokazu predelat na C++. |
|
Návrat nahoru |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 2. říjen 2011, 14:26:00 Předmět: |
|
|
mival napsal: |
to je sice pekne, ale ja potrebuji v C++. Kdyby mi stacilo C# tak uz jsem si navod nasel ale ja to nedokazu predelat na C++. |
hele laskave se prestan vztekat a snaz se - programovani je o hodinach a hodinach zkouseni nez se zadari - ne o zkuseni dvou copy&paste tutorialu a pak prudit na foru!!! |
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 15:03:27 Předmět: |
|
|
Moje veta byla klidna, to ty ted nadavas a zuris |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 16:44:45 Předmět: |
|
|
Bud jsem uplne hloupy, nebo na to nemam vek, nebo to maji spatne, nebo uz nwm . ani jedno z toho mi nejede |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 2. říjen 2011, 16:55:59 Předmět: |
|
|
1) ukaz kod
2) ukaz buildovaci chyby (pokud jsou)
3) popis kde mas problem
jak ti mame asi radit? |
|
Návrat nahoru |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 2. říjen 2011, 16:56:26 Předmět: |
|
|
Tak sem napiš jak ti to nejde, co to (ne)dělá popř. sem hod ten kod...
//EDIT: Rezna mě předběhl |
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 17:02:38 Předmět: |
|
|
kód: |
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <WinSock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <WinError.h>
#include "StdAfx.h"
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
// #pragma comment (lib, "Mswsock.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
using namespace std;
int __cdecl main(void)
{
WSADATA wsaData;
int iResult;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
struct addrinfo *result = NULL;
struct addrinfo hints;
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the server address and port
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if ( iResult != 0 ) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return 1;
}
// Create a SOCKET for connecting to server
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
// Setup the TCP listening socket
iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
// No longer need server socket
closesocket(ListenSocket);
// Receive until the peer shuts down the connection
do {
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
printf("Bytes received: %d\n", iResult);
// Echo the buffer back to the sender
iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
if (iSendResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
printf("Bytes sent: %d\n", iSendResult);
}
else if (iResult == 0)
printf("Connection closing...\n");
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (iResult > 0);
// shutdown the connection since we're done
iResult = shutdown(ClientSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
// cleanup
closesocket(ClientSocket);
WSACleanup();
return 0;
} |
Tohle je kod a momentalne to hlasi tyto chyby:
'freeaddrinfo': identifier not found
'getaddrinfo': identifier not found |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 2. říjen 2011, 17:04:15 Předmět: |
|
|
http://msdn.microsoft.com/en-us/library/ms737931(VS.85).aspx
na konci stranky je, ktere knihovny treba prilinkovat do projektu a co je treba includnout za *.h
pouzivej google!!!
tutorialy z webu nejedou 'as is' jsou to navody jak to udelat
tupym copy&paste se stejne nic nenauci |
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 2. říjen 2011, 17:08:16 Předmět: |
|
|
Je to na me moc tezke, protoze anglicky moc nemumim. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. říjen 2011, 17:14:24 Předmět: |
|
|
Programovat cokoli stylem copy&paste je největší "prasečina" co jde... Nic se nenaučíš, většinou to nefunguje a popř. porušíš nějaká autorská práva.
Btw... to že přihodíš *.h nemusí stačit, pokud nemáš v systému také požadovanou knihovnu... _________________ Perry.cz |
|
Návrat nahoru |
|
|
|