2016-06-14 29 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

相關問題