2011-08-18 127 views
0

我從Andy Tanenbaum的書中得到了這段代碼。我正在嘗試運行它。它編譯並等待連接。但是當我輸入localhost:886時,我在瀏覽器或終端中看不到任何效果。 (它應該按照代碼回顯一個新的連接字符串)。Linux服務器編程

#define  SERVER_PORT   886  /* The port at which the server listens */ 
#define  BUF_SIZE  64032  /* The size of buffer for request and response */ 
#define  QUEUE_SIZE  10  /* Block transfer size */ 


int main (int argc, char* argv[]) { 

    int  sock = 0, bnd = 0, lst = 0, fd = 0, sa = 0, bytes = 0, on = 1, conn_count = 0; 
    char buf[BUF_SIZE]; 
    struct sockaddr_in channel;   /* IP address holder */ 

    /* The address structure that binds with the socket */ 

    memset (&channel, 0, sizeof(channel)); 

    channel.sin_family  = AF_INET; 
    channel.sin_addr.s_addr  = htonl (INADDR_ANY); 
    channel.sin_port  = htons (SERVER_PORT); 

    /* Parital opening of the socket, while waiting for connection */ 

    sock    = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); /* Creates a new socket */ 
    if (sock < 0) 
     printf ("Partial opening of the socket failed! Error: %d", sock); 

    setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)); 

    bnd    = bind (sock, (struct sockaddr *) &channel, sizeof(channel)); 
    if (bnd < 0) 
     printf ("Binding failure! Error: %d", bnd); 

    lst    = listen (sock, QUEUE_SIZE); 
    if (lst < 0) 
     printf ("Unable to listen on the socket! Error: %d", lst); 

    /* The socket has been set-up. Wait for the connection and process it. */ 

    while (1) { 

     conn_count  += 1; 
     printf ("Received connection: %d", conn_count); 
     sa   = accept (sock, 0, 0); 
     if (sa < 0) 
      puts ("Unable to accept the socket opened for connection."); 

     read (sa, buf, BUF_SIZE); 

     puts (buf);  /* Output the string to the screen */ 

     close (sa); 
    } 
} 
+0

嘗試'遠程登錄本地主機的所有端口:886'在命令行上。 –

+0

您可以通過'netstat'確認您的程序是否實際正在偵聽適當的端口。 –

+0

'netstat -tlnp' – Flavius

回答

5

你是以sudo/root身份運行嗎?您的bind()可能會因爲使用特權端口而失敗。


[更新自評:]

特權端口是1024以下

+0

嗯。讓我試試sudo – john

+0

並結合缺少\ n你還沒有看到失敗的綁定的錯誤消息。 –

+0

就是這樣。測試程序綁定到1024以上的某個隨機端口(我的一個啓動時爲36969),當連接到端口併發送一個字符串時,它輸出:'綁定失敗!錯誤:-1Received連接:1test'。我猜,-1是'EACCES'。 – ulidtko

1

嘗試將斷行 '\ n' 你

printf ("Received connection: %d\n", conn_count); 

行的末尾。

否則stdout不會直接刷新,你什麼都看不到。

+0

對於其他行也這樣做,否則你將看不到錯誤信息:/ –

0

而不是使用printf()stdout,嘗試所有的輸出轉變爲fprintf()stderr它沒有緩衝......讓他們立即輸出所謂的,而不是由緩衝的時候我會做同樣的錯誤消息以及stdout

最後,如果您想查看錯誤消息的含義,請使用strerror()和錯誤編號。所以,你可以這樣類似:

if (bnd < 0) 
{ 
    fprintf(stderr, "Binding failure! Error: %s", strerror(bnd)); 
    exit(1); 
} 

確保爲strerror()你也做一個include<string.h>在某處你的代碼模塊的開始。

+0

也是,錯誤後退出,沒有理由繼續......這似乎是一個小玩具服務器,你不應該'用於生產。檢查http://www.unpbook.com/更嚴重的東西。 –

+0

@Jason現在我得到這個幫助:綁定失敗!錯誤:-1接收連接:1 ** **'我有點困惑,它無法綁定套接字,但它仍然功能! – john

+0

它不起作用。但是一個簡單的printf不會停止你的程序,你需要一些退出/返回或其他東西來打印錯誤信息。 –