Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <netinet/in.h>
- int conectar_socket(const char* ip, const char* port) {
- struct addrinfo* socketinfo;
- getaddrinfo(ip, port, NULL, socketinfo);
- // Asumo que la primera conexión es válida.
- int skt = socket(socketinfo->ai_family, socketinfo->ai_socktype, socketinfo->ai_protocol);
- connect(skt, socketinfo->ai_addr, socketinfo->ai_addrlen);
- freeaddrinfo(socketinfo);
- return skt;
- }
- size_t obtener_largo_archivo(FILE* f) {
- size_t largo = 0;
- while (fgetc(f) != EOF) {
- ++largo;
- }
- fseek(f, 0, SEEK_SET);
- return largo;
- }
- int enviar_por_socket(int skt, char* buf, int tam) {
- int enviados = 0;
- int enviado_ultimo;
- while (enviados < tam) {
- enviado_ultimo = send(skt, buf, tam - enviados);
- if (enviado_ultimo <= 0) return -1;
- enviados += recibido_ultimo;
- }
- return enviados;
- }
- int main(int argc, char* argv[]) {
- int skt = conectar_socket(argv[1], argv[2]);
- FILE* f = fopen(argv[3], "r");
- if (!f) return -1;
- size_t largo = obtener_largo_archivo(f);
- size_t enviados = 0;
- char buf[256];
- while (enviados < largo) {
- size_t leidos = fread(buf, 256, 1, f);
- size_t enviados_ultimo = enviar_por_socket(skt, &buf[0], leidos);
- if (enviados_ultimo != leidos) break;
- enviados += enviados_ultimo;
- }
- enviar_por_socket(skt, "\0", 1); // Caracter que indica que finalizo el envio.
- fclose(f);
- shutdown(skt, SHUT_RDWE);
- close(skt);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement