2017-11-18 206 views
1

所以我试图发送一个文件(在这种情况下一个.jpg图像)二进制从客户端在python 3到C服务器通过管道和由于某种原因它显示错误,水管坏了,这里是代码: 蟒蛇:发送二进制图像通过管道在python到C服务器

import os,sys,errno,pipes,signal,time  

def Tuberia(): 
    fifo = "/tmp/fifoNombre" 
    print ("conecting to a pipe...",fifo) 
    file = open("/home/luisro/Pictures/64.jpg","r+b") 
    f = open(fifo,'wb') 
    for line in file: 
     print(line) 
     f.write(line) 
    f.close() 
    file.close() 

以及C服务器:

void reciveFile(){ 
    int fn; 
    char * fifoNombre = "/tmp/fifoNombre"; 
    // //opens the pipe for reading 
    mkfifo(fifoNombre, 0666); 
    unsigned char datos[MAX_BUF]; 
    fn = open(fifoNombre, O_RDONLY); 
    read(fn, datos, MAX_BUF); 
    saving(datos,"/home/luisro/Desktop/algo.jpg"); 
    unlink(fifoNombre); 

} 


void saving(unsigned char *data, char* dirDest){ 
    FILE *flujoArchivo = fopen(dirDest, "wb"); 
    if(flujoArchivo == NULL){ 
     printf("Error saving.\n"); 
     exit(-1); 
    } 
    int writed_size = fwrite(data, sizeof(unsigned char), MAX_BUF, flujoArchivo); 

    fclose(flujoArchivo); 
} 

所以这些都是功能我不知道,如果是Python客户端或问题的C服务器,提前致谢

+0

为/ tmp/fifoNombre不断填充? – TheAschr

+0

是的服务器创建它 – luisro333

回答

1

二进制文件不是面向“行”,这是你如何试图在python读它....下面是显示如何读取Python中的二进制文件的链接:The-link

此外,您可能要如果它大于MAX_BUF,则在服务器接收二进制文件时更改服务器以执行一些循环。

+0

谢谢大家看看它是否工作 – luisro333

0

,所以我解决这个问题而不进行循环是这样的:

def Tuberia(): 
print("sending file") 
    fifo = "/tmp/fifoNombre" 
    print ("connecting to pipe...",fifo) 
    try: 
     f = open(fifo,'wb') 
     with open("/home/luisro/Pictures/64.jpg","r+b") as file: 
      line = file.read() 
      f.write(line) 
      print("sending succesfully...") 
    except: 
     print("problem connecting to pipe\n") 
     Tuberia() 
    print("closing conexions....")  
    time.sleep(2) 
    file.close() 
    f.close() 

的另一个问题是该文件的权重996.9 KB时,它的发送权重8.3 MB至极是MAX_BUF的在C服务器规模做任何人都知道如何为任何文件发送正确的大小?

这里是C服务器:

void reciveFile(){ 
    int fn; 
    char * fifoNombre = "/tmp/fifoNombre"; 
    // //opens the pipe for reading 
    mkfifo(fifoNombre, 0666); 
    unsigned char datos[MAX_BUF]; 
    fn = open(fifoNombre, O_RDONLY); 
    read(fn, datos, MAX_BUF); 
    saving(datos,"/home/luisro/Desktop/algo.jpg"); 
    unlink(fifoNombre); 

} 


void saving(unsigned char *data, char* dirDest){ 
    FILE *flujoArchivo = fopen(dirDest, "wb"); 
    if(flujoArchivo == NULL){ 
     printf("Error saving.\n"); 
     exit(-1); 
    } 
    int writed_size = fwrite(data, sizeof(unsigned char), MAX_BUF, flujoArchivo); 

    fclose(flujoArchivo); 
}