Ir ao conteúdo
  • Cadastre-se

Daniel Bittencourt

Membro Pleno
  • Posts

    75
  • Cadastrado em

  • Última visita

posts postados por Daniel Bittencourt

  1. Bem, há um tempo atrás criei um projeto em c++ e criei o .exe. Passei esse .exe para um amigo e gerou vários arquivos típicos de projeto dev c++( os quais não me lembro o nome). Agora eu queria fazer um outro projeto mas o exe não vai ficar só comigo, quero passar para outras pessoas. Eu acho isso desses arquivos serem gerados nas outras máquinas bem estranho e gostaria de escondê-los, aproveitando dessa situação, gostaria saber também como as pessoas criam arquivos .exe e conseguem por fora de vista os sprites e tudo mais, sendo necessário usar vários processo para achar.

  2. Bom dia!!! Eu estou instalando allegro 5 no meu ambiente de programação e quando faço:

    #include <allegro5/allegro.h>
    int main(){
    }

    para testar, eis que me aparece isso:

    [Error] allegro5/platform/alplatf.h: No such file or directory

    bom, instintivamente, segui o caminho do arquivo não encontrado, pus em ordem alfabética e eis que me deparo com:

    image.png.51544287270658bbe7ecf1d1e9c2ec26.png

    o arquivo .h não existe, apenas um com mesmo nome sendo um CMAKE. o que eu faço?

    Nota: eu também olhei o arquivo que incluia o alplatf e o include estava assim:

    #include "allegro5/platform/alplatf.h"

    Nota 2: o jeito que estou instalando é simplesmente por as bibliotecas do allegro na pasta include da plataforma, onde já tem as bibliotecas normais c e c++.

    nota 3: eu pus // no include do alplatf e deram muitos erros, também tentei acrescentar  o cmake dps do .h e deram outros erros.

  3. @Ricardo_Nascimento não, um vetor é apenas uma forma mais fácil de se referir a algumas variáveis ou para declarar várias juntas. exemplo:

    int numero[40],valor=0;
    for(int conta=0;conta<40;conta++){
    numero[conta]=valor;
    valor+=30;                                                                    
    }                                  

    você economiza um tempo do que fazer isso:

    int numero0=0,numero1 = 30,numero2 = 60,numero3 = 90,numero4 = 120,numero5 = 150.....numero40=1200;

    imagina escrever 40 declarações '-'

    no primeiro exemplo,a parte do int facilita na declaração e o for em se referir mais fácil com o "indíce'' da variável. esse ''indíce'' facilita muito em muitos casos.

    no caso de de um mdc de quatro números:

    mdc(mdc(num1,num2),mdc(num3,num4));

    cinco numeros:

    mdc(mdc(mdc(num1,num2),num3),mdc(num4,num5));

    seis:

    mdc(mdc(mdc(num1,num2),num3),mdc(mdc(num4,num5),num6));

    obvio que no caso de muitos números é muito mais fácil fazer como o midori falou:

    //4 números
    int x = mdc(mdc(num1,num2),num3);
    int res = mdc(x,num4);
    //ou então assim, fácil de entender, mas maior:
    int x = mdc(num1,num2);
    int y = mdc(x,num3);
    int res = mdc(y,num4);
    //5 números, como eu faria:
    int x = mdc(num1,num2);
    int y = mdc(x,mdc(num3,num4));
    int res = mdc(y,num5);

    dá para saber como prosseguir se precisar correto?

    • Curtir 1
    • Obrigado 1
  4. bom,o compilador vai ver a 1 função e vai ver qual os dois números que vão ser os do calculo do mdc. então aí no primeiro número tem a função do mdc correto? então o valor do pimeiro número é o valor dessa função. porque essa fução também é um int , mas com parametros( os números que vão ser referencia para a função). então é a mesma coisa que por uma variavel int nesse lugar. Mas qual é o valor dessa função? É o valor de retorno. e qual é o valor de retorno? o mdc dos números dentro dos parenteses. Então basicamente quando o compilador ver o primeiro parametro, ele vê uma variável e olha o valor dessa variavel, que é o mdc dos dois primeiros números, depois disso olha o depois dessa 2 função e ve um numero. Então calcula o mdc dos dois primeiros com o terceiro. 
    Resumo:

    a 1 função olha os valores que deve calcular o mdc

    o 1 valor é o retorno de outro mdc

    pega o resultado desse 2 mdc

    e a 1 função faz o mdc desse resultado com o outro número que recebeu, o num3.

    É meio difícil de explicar, espero que entenda 

    • Curtir 1
    • Obrigado 1
  5. @Benjamin Breeg  

    Em 12/03/2021 às 19:04, Benjamin Breeg disse:

    Você esta dizendo criar a janela Win32 e fazer o Allegro usar esse contexto Win32?

    basicamente o que eu quis dizer foi usar allegro para abrir uma imagem e saber a cor e posição de cada pixel dela. a parte de por a imagem na tela, eu deixo na WinApi32. Não vejo muita possibilidade de conflito, por que no código que eu quero por a tela cheia uso WinApi32 e Allegro 4 sem nenhum erro e com as duas bibliotecas funcionando bonitinhas. Se o conflito for as funções de bitmap da windows.h, já está resolvido, mudei de struct BITMAP da winapi32 para BiTMAP sempre que é dito.

    Em 12/03/2021 às 19:04, Benjamin Breeg disse:

    na pratica o Allegro usa a Win32 por trás da cortina.

    tirou as palavras da minha boca.

     

     

    Eu vou tentar arrumar um jeito de fazer o código funcionar

    Em 13/03/2021 às 11:14, arfneto disse:
    • usar GetSystemMetrics() e outras chamadas da família e identificar o particular monitor se tiver mais de um e os tamanhos em uso.
    • Se a barra de tarefas estiver fixa usar simples aritmética para saber o quanto sobra de tela e salvar esse par (X,Y)
    • Simplesmente crie a janela de seu aplicativo posicionada em (0,0) e com esse tamanho (X,Y) e ela naturalmente vai ocupar a tela toda, sem ser de fato maximizada, o que traria outros problemas

    Bom, provavelmente o motivo de ter gerado a janela pequena, bom não foi de eu ter deixado as medidas pequenas ou não definidas. Bem digamos que eu misturei o codigo que já vem pronto quando cria um projeto com allegro com o da janela. E eu tirei a parte de iniciar o gfx, mas... não tirei a parte que olhava se a variavel de retorno do gfx era igual a 0 para saber se ocorreu erro.. e nessa hora que olha o valor dela abria uma pequena messagebox e não deixava o programa prosseguir, por isso achei que a janela estava pequena. Basicamente fiz isso:

    //	res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
    	if (res != 0) {
    		allegro_message(allegro_error);
    		exit(-1);
    	}

    refiz o codigo( porque havia excluido), vi isso e concertei. Agora o programa pos o objetivo que era a linha na janela. Mas não uma, nem duas, nem três e sim muitas janelas. Porque gera isso, não sei, mas sei que se alguém testar o código basta clicar com o botão direito na janela na barra de tarefas, clicar em fechar todas, dar cntrl.+ shift + esc e descer tudo no gerenciador de tarefas e fechar a janela na primeira linha das janelas iguais assim:

    image.png.6bb08366d06752a6c0518b457a41ac4f.png

     

    image.png.b11c7bfcaa71ab3d59e37335ab74694e.png  

    image.png.706d614d60d6f00eb45d5b5f0b425ad0.png

    depois, cliquem em cancelar na janela de erro.

    por fim, o código:

    #include <allegro.h>
    #include <windows.h>
    void init();
    void deinit();
    static HWND sHwnd;
    static COLORREF blue=RGB(0,0,255);
    void SetWindowHandle(HWND hwnd)
    {
    	sHwnd=hwnd;
    }
    void setPixel(int x,int y,COLORREF& color=blue)
    {
    	if(sHwnd==NULL) {
    		MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
    		exit(0);
    	}
    
    	HDC hdc=GetDC(sHwnd);
    	SetPixel(hdc,x,y,color);
    	ReleaseDC(sHwnd,hdc);
    	return;
    
    // NEVERREACH //
    }
    
    void drawLineBresenham(int xa, int ya, int xb, int yb)
    {
    	int dx = abs(xa - xb), dy = abs(ya - yb);
    	int p = 2 * dy - dx;
    	int twoDy = 2 * dy, twoDyDx = 2 * (dy - dx);
    	int x, y, xEnd;
    
    	if (xa > xb) {
    		x = xb;
    		y = yb;
    		xEnd = xa;
    	} else {
    		x = xa;
    		y = ya;
    		xEnd = xb;
    	}
    
    	setPixel(x, y);
    
    	while(x < xEnd) {
    		x++;
    		if(p < 0)
    			p += twoDy;
    		else {
    			y++;
    			p += twoDyDx;
    		}
    
    		setPixel(x, y);
    	}
    }
    void init() {
    	int depth, res;
    	allegro_init();
    	depth = desktop_color_depth();
    	if (depth == 0) depth = 32;
    	set_color_depth(depth);
    	install_timer();
    	install_keyboard();
    	install_mouse();
    	/* add other initializations here */
    }
    
    void deinit() {
    	clear_keybuf();
    	/* add other deinitializations here */
    }
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    			init();
    			SetWindowHandle(hwnd);
    drawLineBresenham(20,30,90,50);
    
    deinit();
    	return DefWindowProc(hwnd,message,wParam,lParam);
    
    }
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
    {
    	static TCHAR szAppName[] = TEXT("Straight Line");
    	WNDCLASS wndclass;
    	wndclass.style         = CS_HREDRAW|CS_VREDRAW ;
    	wndclass.lpfnWndProc   = WndProc ;
    	wndclass.cbClsExtra    = 0 ;
    	wndclass.cbWndExtra    = 0 ;
    	wndclass.hInstance     = hInstance ;
    	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    	wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    	wndclass.lpszMenuName  = NULL ;
    	wndclass.lpszClassName = szAppName ;
    
    	// Register the window //
    
    	if(!RegisterClass(&wndclass)) {
    		MessageBox(NULL,"Registering the class failled","Error",MB_OK|MB_ICONERROR);
    		exit(0);
    	}
    
    	// CreateWindow //
    
    	HWND hwnd=CreateWindow(szAppName,"Bresenham's Algorithm - Programming Techniques",
    	                       WS_OVERLAPPEDWINDOW,
    	                       CW_USEDEFAULT,
    	                       CW_USEDEFAULT,
    	                       CW_USEDEFAULT,
    	                       CW_USEDEFAULT,
    	                       NULL,
    	                       NULL,
    	                       hInstance,
    	                       NULL);
    
    	if(!hwnd) {
    		MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);
    		exit(0);
    	}
    
    	// ShowWindow and UpdateWindow //
    	ShowWindow(hwnd,iCmdShow);
    	UpdateWindow(hwnd);
    
    	// Message Loop //
    	MSG msg;
    
    	while(GetMessage(&msg,NULL,0,0)) {
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	/* return no error to the operating system */
    	return 0;
    }

     

  6. Eu tive uma ideia hoje para resolver esse problema: se eu criasse uma janela com a própria windows.h, que já vem no meu IDE, e então eu simplesmente uso algo parecido com:

    BITMAP *imagem = load_bitmap("img.bmp",NULL);
    for(int conta = 0; conta <=imagem->w;conta++){
    for(int conta2 = 0; conta2<=imagem->h;conta2++){
    int pixel =  getpixel ( cara, 0, 0 ) ;
    int red = getr(pixel); 
    int green = getg(pixel);
    int blue = getb(pixel);
    static COLOREFF color = RGB(red,green,blue);
    setPixel(color,conta,conta2);
    }
    }

    com setPixel escrevendo na janela criada com windows.h.

    O problema é a janela de windows.h ativada com allegro eu fiz um teste e a janela saiu minúscula e eu não entendo dessa parte de criar janelas. Seria possível fazer o que eu estou pensando? eu acho que o arquivo foi excluido. 

  7. Bom dia, eu estou fazendo um jogo online com c++ e allegro e bem... Quando eu vou testar (com somente 2 clientes) demora cerca de 2 minutos para andar 5 posições em cada cliente. isso ocorre porque os clientes ficam esperando receberem informação do server ,mas para ele enviar, o outro cliente tem que enviar primeiro e esse cliente só envia se estiver selecionado. Basicamente se eu quero andar em um dos clientes eu tenho que ficar pressionando a seta na direção que eu quero e trocar de janela rapidamente para rodar os clientes. isso chega a ser desgastante. alguém sabe um metódo de uma janela allegro (eu uso o tipo gfx) ser rodada sem estiver selecionada? 

    bom eu consegui pôr um modo de se mover sem ter que esperar receber informações do servidor(com beginthread), mas o problema é que o server ainda espera receber para enviar, o que faz com que se você está com o jogo no plano de fundo, os outros players ficam sem receber as informações do server, o que quebra o jogo 

  8. Bom, estou fazendo um programa em c++ com winsock 2, mas ocorrem vários erros em relação a winsock2, prinicpalmente em send() e recv(), então eu acredito que deveria usar uma biblioteca de terceiros(de programação tcp/ip) para facilitar. Alguém recomenda uma e consegue me ensinar a instalação? preciso que ensinem por que eu fiquei literalmente 11 meses tentando instalar allegro então não acho q vá conseguir instalar outra tão facilmente rsrs.

  9. bem, estou fazendo um programa em c++ utilizando o tcp/ip e estava funcionando até que o server começou a enviar uma informação para o cliente mas o mesmo não a recebe. vou por os trechos necessários aqui

    server.cpp

      WSADATA wsaData;
        int iResult; // pega alguns resultados que o client envia
    const char *sendbuf = "ha"; //bem, é usado como o vetor char do send
        SOCKET ListenSocket = INVALID_SOCKET; // socket para ouvir
        SOCKET ClientSocket = INVALID_SOCKET; // socket do 1 client
        SOCKET ClientSocket2 = INVALID_SOCKET; //socket do 2 client
        struct addrinfo *result = NULL; 
        struct addrinfo hints;
    
        int iSendResult;
        char recvbuf[DEFAULT_BUFLEN];
        int recvbuflen = DEFAULT_BUFLEN;
    
    int __cdecl main(void) 
    {
    
    _beginthread(accepts,0,NULL); //accepts é onde ele vai aceitar os clients enquanto executa,se necessário
    
    int ix2,ix, iResult2;
    	for(;;){
    		iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
            
    		iResult2 = recv(ClientSocket2, recvbuf, recvbuflen, 0);
    		printf("1:%i 2:%i recebido ",iResult, iResult2);//pus esses printf para ter noção de onde travava o programa
    		
    		ix2 = send(ClientSocket2, recvbuf, iResult, 0 );
            printf("primeiro enviado"); 
    		ix = send(ClientSocket, sendbuf, iResult2, 0 );
    Sleep(700);
    }
    // bem o programa do server recebe o x de dois clientes e manda o x de um para o outro{ x eh uma coordenada não tem y porque ainda não pus, vou trabalhar com apenas um antes de dois} e assim os dois clientes imprimem no y 40 e x pertencente ao programa o personagem dele( um ponto mesmo estou com preguiça) e no y 30 e x recebido do server outro ponto
    void accepts(void * ){
    int g=0;// a variavel que vai mostrar quando for o cliente 2 e quando for o 1 
    	for(;;){
        // Initialize Winsock
        if(g==0){// se não tiver nenhum cliente ainda
    	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        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);
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
        iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
        freeaddrinfo(result);
    
        iResult = listen(ListenSocket, SOMAXCONN);
       ClientSocket = accept(ListenSocket, NULL, NULL);
        closesocket(ListenSocket);
    g++;//mostrar que ja tem um cliente
    }
    else{ // se ja tiver um cliente aceito
    		iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;
    
    
        iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
        iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    
        freeaddrinfo(result);
    
        iResult = listen(ListenSocket, SOMAXCONN);
    
       ClientSocket2 = accept(ListenSocket, NULL, NULL);
      
        closesocket(ListenSocket);
    }
    }
    }

    cliente.cpp

    void mgotoxy(int x, int y) {
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD) {
    		x,y
    	});
    }
    int __cdecl main(int argc, char **argv) 
    {
        WSADATA wsaData;
        SOCKET ConnectSocket = INVALID_SOCKET;// socket para acessar o server
        struct addrinfo *result = NULL,
                        *ptr = NULL,
                        hints;
        const char *sendbuf = "ha";// vetor de char usado para receber informações
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;// recebe alguns valores do server
        int recvbuflen = DEFAULT_BUFLEN;
    
    
    
    
    
    
    //algumas partes de conexão depois...
    
    
    
    
    printf("conectado");
    int x=0,e,e2,x2=0;// x eh o x, e é a variavel que guarda o valor de x antes de andar para apagar a essa posição e2 eh para o x2(do outro cliente) e x2 eh o x do outro cliente
    			Sleep(1000);
    			for(;;){
    	e=x;
    	e2=x2;
    	iResult = send( ConnectSocket, sendbuf, x, 0 );	
    	printf(" enviado");
    	    printf("Bytes enviados: %d\n", iResult);
    		x2 = recv(ConnectSocket, recvbuf, recvbuflen, 0);			
    		printf(" recebido");//ele não imprime recebido, então creio que trava na hora de receber
    			if(GetAsyncKeyState(VK_RIGHT))x++; //movimentação do ponto
    		if(GetAsyncKeyState(VK_LEFT))x--;
    		mgotoxy(x,40);//escreve o ponto DESTE cliente
    		printf(".");
    		mgotoxy(e,40);//apaga o "rastro" DESTE cliente
    		printf(" ");
    		mgotoxy(x2,30);// escreve o outro cliente na tela deste
    	    printf(".");
    	    mgotoxy(e2,40);
    		printf(" ");
    
    
    Sleep(700);// pausa um tempinho para não ficar muito frenético
    }    

    bom se já verem o erro podem falar mas se precisarem do codigo inteiro me digam e eu passo daqui a pouquinho pois vou sair uns 5minutos para fazer uma caminhada 

  10. @arfneto eu já pensava isso na primeira vez que tentei há um tempo atrás, mas agora não pensei nisso, mas n sei onde ponho, pode me falar?

    creio eu q seja por aqui

    int __cdecl main(int argc, char **argv) 
    {
        WSADATA wsaData;
        SOCKET ConnectSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL,
                        *ptr = NULL,
                        hints;
        const char *sendbuf = "this is a test";
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;
        int recvbuflen = DEFAULT_BUFLEN;
        
        // Validate the parameters
        if (argc != 2) {
            printf("usage: %s server-name\n", argv[0]);
            return 1;
        }

    eu tenho um pouco de dificuldade em entender esses códigos de outros, sou bem melhor em criar um para satisfazer uma vontade, mas para fazer isso preciso de uma base e para entender melhor o tcp/ip planejo usar isso de base

  11. bom, preciso criar um programa usando o tcp/ip para deixá-lo online, para ter uma boa base usei a documentação da microsoft e... bem o programa deu isso:

     

    Citação

    image.thumb.png.5b666ddd714abb79e90f65f534b07b44.png

    alguém pode me expilcar?

    ahh e os códigos

    Citação

     

     

    server.cpp
    #undef UNICODE
    
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.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"
    
    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;
    }
    client.cpp
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    
    // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
    #pragma comment (lib, "Ws2_32.lib")
    #pragma comment (lib, "Mswsock.lib")
    #pragma comment (lib, "AdvApi32.lib")
    
    
    #define DEFAULT_BUFLEN 512
    #define DEFAULT_PORT "27015"
    
    int __cdecl main(int argc, char **argv) 
    {
        WSADATA wsaData;
        SOCKET ConnectSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL,
                        *ptr = NULL,
                        hints;
        const char *sendbuf = "this is a test";
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;
        int recvbuflen = DEFAULT_BUFLEN;
        
        // Validate the parameters
        if (argc != 2) {
            printf("usage: %s server-name\n", argv[0]);
            return 1;
        }
    
        // 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_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
    
        // Resolve the server address and port
        iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed with error: %d\n", iResult);
            WSACleanup();
            return 1;
        }
    
        // Attempt to connect to an address until one succeeds
        for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
    
            // Create a SOCKET for connecting to server
            ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
                ptr->ai_protocol);
            if (ConnectSocket == INVALID_SOCKET) {
                printf("socket failed with error: %ld\n", WSAGetLastError());
                WSACleanup();
                return 1;
            }
    
            // Connect to server.
            iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
            if (iResult == SOCKET_ERROR) {
                closesocket(ConnectSocket);
                ConnectSocket = INVALID_SOCKET;
                continue;
            }
            break;
        }
    
        freeaddrinfo(result);
    
        if (ConnectSocket == INVALID_SOCKET) {
            printf("Unable to connect to server!\n");
            WSACleanup();
            return 1;
        }
    
        // Send an initial buffer
        iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
        if (iResult == SOCKET_ERROR) {
            printf("send failed with error: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
    
        printf("Bytes Sent: %ld\n", iResult);
    
        // shutdown the connection since no more data will be sent
        iResult = shutdown(ConnectSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
            printf("shutdown failed with error: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
    
        // Receive until the peer closes the connection
        do {
    
            iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
                printf("Bytes received: %d\n", iResult);
            else if ( iResult == 0 )
                printf("Connection closed\n");
            else
                printf("recv failed with error: %d\n", WSAGetLastError());
    
        } while( iResult > 0 );
    
        // cleanup
        closesocket(ConnectSocket);
        WSACleanup();
    
        return 0;
    }

     

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!