我编写了一个程序,以便在运行时与我们的更新软件进行交互。基本上要求一个地位,并且能够远程杀死它。为了做到这一点,程序在启动时通过命令行获取主机IP和命令。这样的事情:argv从最后开始的剩余部分
./updater_killer <host_name> die
这本身工作正常。但是,当我使用较长的命令,比做了第二次开始用更短的一个,第一个命令的其余部分填满了第二个:
./updater_killer <host_name> status
./updater_killer <host_name> die
的第一个正常工作。但对于第二个我得到以下信息:
我甚至更长的时间与那些留在下次启动藏汉其余命令试了一下。
这是我在建立连接后使用argv[2]
发送命令的部分。
if (send(sockfd, argv[2], strlen(argv[2]), 0) == -1)
perror("send");
我befor它的使用不以任何方式改变argv[2]
。我allthough试图存储它在string
或*char
befor发送它。但没有帮助。我认为这是关于内存的东西,它仍然被分配。但我不知道如何释放argv
作为下一个节目的开始。
我需要什么来摆脱下一次启动程序中最后一条命令的剩余部分?
编辑:
从EJP答案我解决了这个接收器上的一面:
if ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
有了它,现在工作的buf[numbytes] = '\0';
。如果我可以依靠numbytes
,我不是很舒服。
我猜接收器假设从套接字读取的数据是一个nul终止的字符串。请注意,发送的send()代码不*终止发送的数据。 –
@AndrewHenle如果接收者假定它应该读取直到它变为null,而不是一旦'recv()'返回就进行。 – EJP
感谢您的帮助。我在记录方面改变了它(并将其编辑成问题,让其他人看到我做了什么),并且工作正常。但是我并不是说'这不一定和recv()返回的值一样。“还有什么可以recv()返回0或字节数? – DocRattie