2016-06-14 51 views
0

我编写了一个程序,以便在运行时与我们的更新软件进行交互。基本上要求一个地位,并且能够远程杀死它。为了做到这一点,程序在启动时通过命令行获取主机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,我不是很舒服。

回答

3

接收方明显忽略recv()返回的长度。但是,你也假设一个send()等于一个recv(),这是不正确的。您需要设计一个应用程序协议,例如一个长度字前缀,告诉接收方在消息中需要多少数据。这是而不是必然与recv()返回的值相同。

+1

我猜接收器假设从套接字读取的数据是一个nul终止的字符串。请注意,发送的send()代码不*终止发送的数据。 –

+1

@AndrewHenle如果接收者假定它应该读取直到它变为null,而不是一旦'recv()'返回就进行。 – EJP

+0

感谢您的帮助。我在记录方面改变了它(并将其编辑成问题,让其他人看到我做了什么),并且工作正常。但是我并不是说'这不一定和recv()返回的值一样。“还有什么可以recv()返回0或字节数? – DocRattie