Ir ao conteúdo

Posts recomendados

Postado

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;
}

 

Postado

Talvez seja o caso de você explicar o que espera fazer com isso

 

30 minutos atrás, Daniel Bittencourt disse:

preciso criar um programa usando o tcp/ip para deixá-lo online

 

Que significa?

 

TCP/Ip nada term a ver com on-line. Pode se conectar ao seu próprio programa na mesma máquina e isso não faz com que ele esteja "online" ou "offline". Talvez se refira a um socket aceitando conexões como algo online.

 

Como definiu server_name? no ambiente? Se estão rodando na mesma maquina porque não escreveu o endereço de locahost simplesmente?

 

 

Postado
2 minutos atrás, Daniel Bittencourt disse:

eu não fiz nada ai, só quero uma base com esse arquivo da microsoft, não escrevi isso, foi apenas retirado de lá 

 

Como eu disse, o programa espera um argumento: o tal server-name. Não basta você repetir o nome lá. Seria como mandar uma carta para "Nome do Destinatário". Não vai chegar...

 

Sequer leu o programa em busca de uma base? digitou server-name como se fosse algo significativo? Sim, era. O nome do servidor. Ou o endereço. Então precisa de um. Em geral se põe no ambiente se vai testar o programa sem argumentos. Ou digita algo significativo ali. Se está na mesma máquina use localhost. Nada tem a ver com online.

Postado

@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

Postado

Leia algo sobre TCP\IP

 

E leia um programa antes de simplesmente rodar. Rodar o programa não vai te dar qualquer "base".  Ler o programa, mesmo que não rode, pode te ensinar muito.

 

3 minutos atrás, Daniel Bittencourt disse:

mas n sei onde ponho, pode me falar?

creio eu q seja por aqui

 

server_name é o endereço do servidor. Por isso tem esse nome.
 

14 minutos atrás, arfneto disse:

Se está na mesma máquina use localhost

 

Leu isso?

 

Você escreveu simplesmente server_name? Como acha que vai funcionar?

 

Tente um ping em server_name:

 

C:\Windows\System32>
C:\Windows\System32>ping -n 1 server_name
A solicitação ping não pôde encontrar o host server_name. Verifique o nome e tente
novamente.

C:\Windows\System32>ping -n 1 localhost

Disparando DSK-2009 [::1] com 32 bytes de dados:
Resposta de ::1: tempo<1ms

Estatísticas do Ping para ::1:
    Pacotes: Enviados = 1, Recebidos = 1, Perdidos = 0 (0% de
             perda),
Aproximar um número redondo de vezes em milissegundos:
    Mínimo = 0ms, Máximo = 0ms, Média = 0ms

C:\Windows\System32>

 

O programa servidor vai aguardar conexão. Só isso. Mas o cliente vai se conectar como? Precisa de um endereço, mas em geral é um nome. E aí server_name parece uma boa lembrança. É claro que tem que trocar server_name pelo nome do servidor. Se ele não está resgistrado em nenhuma rede, o endereço ao menos. Nunca o singelo nome "server_name"  porque o programa não vai adivinhar.

 

Eventualmente veja os comandos PING TRACERT IPCONFIG e ROUTE no Windows, que tem a ver com TCP/IP e os arquivos hosts services e protocol, que são a "base" do TCP\IP no Windows. C:\Windows\System32\drivers\etc é a pasta base.

 

Num ambiente doméstico ou de pequena empresa ou escola a rede IP é criada em torno de outros protocolos sobre TCP/IP, em particular DHCP e DNS. E precisa ter uma noção mínima dessas coisas antes de programar usando sockets. Minha opinião apenas.

 

 

 

  • Curtir 1
Postado
15 minutos atrás, Daniel Bittencourt disse:

eu precisava saber apenas onde escrevo localhost porque eu não acho!! é no printf???acho que não pois é o unico lugar que vi isso!!

eu não estou brincando eu não sei onde devo substituir

 

Eu nem sei o que dizer

 

Vou apenas repetir

 

troque server_name por localhost. Ou 127.0.0.1

 

Seria ingenuidade colocar o nome do servidor ou o endereço fixos dentro do programa. Imagine ter que compilar o programa porque mudou o endereço do servidor: seria como ter um navegador que acessasse um site só e aí você compila o código do navegador para mudar o site... E tem que ter o código sempre à mão ;) 

 

E por certo  dentro do programa não seria no printf() que é um comando de saída para stdout...

  • Curtir 1
Postado
1 minuto atrás, arfneto disse:

Eu nem sei o que dizer

 

Vou apenas repetir

 

troque server_name por localhost. Ou 127.0.0.1

cara se eu não tenho a menor ideia de onde trocar, como trocarei?????

só me diga ONDE em qual PARTE do programa está isso!!!!!!!!!

Postado
1 minuto atrás, Daniel Bittencourt disse:

cara se eu não tenho a menor ideia de onde trocar, como trocarei?????

só me diga ONDE em qual PARTE do programa está isso!!!!!!!!!

 

Nenhuma parte, Daniel.

 

Trata-se da linha de comando

 

	Client.exe localhost so isso

 

Não sabe o que é a linha de comando? 

 

Não sabe porque declara
 

int main(int argc, char** argv);

 

?

 

Precisa de melhores instrutores. Ou livros. :) 

 

Teste agora.

  • Curtir 1
Postado
1 minuto atrás, Daniel Bittencourt disse:

ah, mas eu estou executando no dev c++, por isso essa confusão, que eu saiba, não tem linha de comando nele, kkk

 

claro que tem. É básico. Não existe C ou C++ sem linha de comando. Apenas aprenda como enviar

Postado

@Daniel Bittencourt claro que não. Esses são para o compilador.


Onde deveria estar pelo menos
 

    -std=c17 -Wall

...

 

vou ver se tem uma maquina aqui com isso

Não, não tem mais. Esse é o pior IDE que eu já vi. Eu instalei uma vez pra ajudar alguém mas já não tem mais em lugar nenhum aqui.

 

Veja no menu executar. Tem que ter uma opção lá. 

 

É muito básico. C, C++, java, BAT, qualquer coisa tem que ter linha de comando...

 

E naturalmente tem a ver com a execução, não com a compilação.

 

Evite ao máximo rodar seus programas dentro do IDE. Qualquer IDE. É outro ambiente. E fuja desse Dev-C++. É o pior que eu já vi...

 

E aqui considere que você tem que rodar DOIS programas....

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!