我編寫了一個程序,以便在運行時與我們的更新軟件進行交互。基本上要求一個地位,並且能夠遠程殺死它。爲了做到這一點,程序在啓動時通過命令行獲取主機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