2014-03-04 63 views
4

netcat的一個很酷的功能是它可以將任何命令行程序轉換爲服務器。例如,在Unix系統中,我們可以通過將date二進制netcat做一個簡單的日期服務器,以便它stdout通過套接字發送:使用netcat將簡單的C程序轉換爲服務器

netcat -l -p 2020 -e date 

然後,我們可以從另一臺機器上調用這個服務通過簡單地發出命令:

netcat <ip-address> 2020 

即使外殼可連接(/bin/sh),雖然我知道這是非常不推薦的,有很大的安全隱患。

同樣,我試圖讓我自己簡單的C程序,讀取和從stdinstdout寫道:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) 
{ 
    char buffer[20]; 
    printf("Please enter your name:\n"); 
    fgets(buffer, 20, stdin); 
    printf("Hello there, %s\n", buffer); 
    return 0; 
} 

然而,當我從另一個終端調用服務,沒有開始的問候;實際上只有在發送一些信息後纔打印問候語。例如:

[email protected]:~$ netcat localhost 2020 
User 
Please enter your name: 
Hello there, User 

什麼我需要做的,使我的問候都將通過套接字最初被髮送,然後等待輸入,然後發送最後消息(就像我直接調用二進制)?

我知道可能有更好的(也可能更安全)方法來實現這樣的系統,但我很好奇netcat的功能,以及爲什麼這不起作用。

回答

3

stdout在寫入非終端時沒有行緩存。在printf之後執行fflush(stdout)

+0

太棒了!謝謝! – Peter

+1

你也可以使用不緩衝的dprintf()。 – Jean

+0

@Phibonacci恆星的建議,如果你有一個文件描述符。 – cnicutar