如何使用套接字 C/C++ 以块形式发送文件

how to send files in chunk using socket c/C++?

本文关键字:文件 套接字 何使用 C++      更新时间:2023-10-16

我一直在尝试找到如何在 C 或 C++ 中以块的形式发送文件我看了这里的一些例子,没有找到好的例子。我对 C/C++ 中的 Sockect 编程非常陌生

http://beej.us/guide/bgnet/html/single/bgnet.html

任何想法我需要如何在客户端和服务器之间以块形式发送文件? 客户端请求文件,服务器将其发送回去。

我找到了这个发送,但不确定是否接收它。

#include <sys/types.h>
#include <sys/socket.h>
int sendall(int s, char *buf, int *len)
{
    int total = 0;        // how many bytes we've sent
    int bytesleft = *len; // how many we have left to send
    int n;
    while(total < *len) {
        n = send(s, buf+total, bytesleft, 0);
        if (n == -1) { break; }
        total += n;
        bytesleft -= n;
    }
    *len = total; // return number actually sent here
    return n==-1?-1:0; // return -1 on failure, 0 on success
}

我刚刚编写了这段代码来接收Client using linux sockets in C中的文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PORT 4118
#define MaxBufferLength 1024 // set the size of data you want to recieve from Server

int main()
{
    int sockFd, bytesRead= 1, bytesSent;
    char buffer[MaxBufferLength];
    struct sockaddr_in server, client;

    server.sin_port= htons(PORT);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    sockFd = socket(AF_INET, SOCK_STREAM, 0);

    if(sockFd < 0)
        printf("Unable to open socketn");
    int connectionSocket = connect(sockFd, (struct sockaddr *) &server, sizeof(struct sockaddr) );
    if(connectionSocket < 0)
        perror("connection not establishedn");

    int fd = open("helloworlds.txt",O_CREAT | O_WRONLY,S_IRUSR | S_IWUSR);  
    if(fd == -1)
        perror("couldn't openf iel");
    while(bytesRead > 0)
    {           
        bytesRead = recv(sockFd, buffer, MaxBufferLength, 0);
        if(bytesRead == 0)
        {
            break;
        }
        printf("bytes read %dn", bytesRead);
        printf("receivnig datan");
        bytesSent = write(fd, buffer, bytesRead);

        printf("bytes written %dn", bytesSent);
        if(bytesSent < 0)
            perror("Failed to send a message");
    }

    close(fd);
    close(sockFd);
    return 0;
}

希望这有帮助

看看TCP_CORK(男人 7 tcp)。但实际上,除了你想成为套接字/网络编程专家,使用库!想想你的下一个问题:数据加密(例如HTTPS/SSL)。图书馆关心血腥的细节...