繁体   English   中英

通过套接字传输时,Unix可执行文件已更改为Document

[英]Unix Executable file get changed to Document while transferring through sockets

我在Mac OSX上。 我已经编写了两个程序来将“ Unix可执行文件”从一个地方转移到另一个地方(服务器程序到客户端程序)。 这是代码:

服务器端代码:

fileDescriptor = open(reqMsg.filename, O_RDONLY);
if (fileDescriptor > 0)
    while ((msgLength = read(fileDescriptor, content, MESSAGESIZE)) > 0)
        send(data.remoteSocketDes, content, msgLength, 0);

客户端代码:

fileDescriptor = open(data.filename, O_CREAT|O_WRONLY);
if (fileDescriptor > 0)
    while ((msgLength = recv(localSocketDes, content, MESSAGESIZE, 0)) > 0)
        write(fileDescriptor, content, msgLength);

文件的大小和内容完全相同,但是文件的类型从“ Unix可执行文件”更改为“文档”。 最终,我无法从它被复制的地方执行它。

注意:该代码对于“ .txt”文件正常工作。

文件的“可执行”属性是其权限而不是其内容的函数。 仅将其内容复制到另一个文件将不会保留此属性。

如果要保留此权限,则需要序列化原始文件的权限(可以使用文件上的stat()获得该权限),将其发送给客户端,然后将其应用于新文件(使用chmod() ,或将权限传递给open() )。

如果保留这样的文件元数据很重要,则可能还需要考虑保留文件的创建和修改时间以及扩展属性。

在Unix(以及OS X等变体)下,是否可以从shell提示符下执行命令的决定因素是您要执行的文件是否设置了execute位(并且您有权执行该文件)。

要从命令提示符处处理此问题,您只需使用chmod +x {file} ,但是如果您知道传入的文件是可执行文件(可以通过先在sender中进行测试,然后通过前导中的套接字发送该信息),则可以使用chmod()对您的接收程序进​​行编码,以设置执行位:

chmod( data.filename, permission)

在其中通过使用默认umask或将执行位计算权限来计算权限的地方,如下所示:

mode_t mask = umask (0);
umask (mask);
mode_t permission = mask | S_IXUSR | S_IXGRP | S_IXOTH;

请注意,这会将权限设置为“可写”,“组”和“所有者”可写,这可能是不希望的。 另外请注意,由于第一次调用具有破坏性,因此必须第二次调用umask。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM