![](/img/trans.png)
[英]C UNIX datagram sockets — how to get file descriptor into fd_set
[英]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.