2016-10-01 52 views
0

我編寫了這個小服務器,它不起作用。直接在開頭的消息也沒有打印出來,我不知道如何使用gdb分析問題。你可以幫幫我嗎?有沒有圖書館丟失或最新錯誤?c中的簡單服務器不起作用

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

#define PORT 7890 

int main(void) { 
    printf("HelloWorld"); 
    int sockfd, sock_client; 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
     printf("Could no open socket\n"); 
    } 
    int yes = 1; 
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (int)) == -1) { 
     printf("Coud not reuse\n"); 
    } 

    printf("socket was created"); 


    struct sockaddr_in sockaddr_host, sockaddr_client; 
    sockaddr_host.sin_family = AF_INET; 
    sockaddr_host.sin_port = htons(PORT); 
    sockaddr_host.sin_addr.s_addr = 0; 
    memset(&(sockaddr_host.sin_zero), '\0', 8); 



    if (bind(sockfd, (struct sockaddr *) &sockaddr_host, sizeof (sockaddr_host)) == -1) { 
     printf("Could not bind socket"); 
    } 
    if (listen(sockfd, 1) == -1) { 
     printf("Could not start listening"); 

    } else { 
     printf("Server is listening on %s: %d", inet_ntoa(sockaddr_host.sin_addr), ntohs(sockaddr_host.sin_port)); 
    } 

    while (1) { 
     socklen_t client_length = sizeof (sockaddr_client); 
     if ((sock_client = accept(sockfd, (struct sockaddr *) &sockaddr_client, &client_length)) == -1) { 
      printf("Could not accept connection"); 
     } 
     printf("sever: got connection from %s on port %d", inet_ntoa(sockaddr_client.sin_addr), ntohs(sockaddr_client.sin_port)); 
     char message[] = "Hello\n"; 
     if (send(sockfd, message, sizeof (message), 0) == -1) { 
      printf("Could not send message"); 
     } 
     close(sock_client); 
     close(sockfd); 
    } 

    return 0; 
} 
+1

你的意思是「HelloWorld」不打印?請更具體地解釋,你的輸出是什麼,以及你的期望。 –

+1

if(question.contains(「It does not work」)){close(question,reason =「Unclear what you ask。」)} –

回答

1

如果您遺漏了一個庫,鏈接器已經投訴。

標準輸出通常是線路緩衝的。在HelloWorld之後添加換行符,您至少會看到第一個輸出。

printf("HelloWorld\n"); 

與其他printf相同。


添加\n每個printf後,你會看到

的HelloWorld
插座創建
服務器監聽0.0.0.0:7890

現在,當您連接到你的服務器,例如與netcat

nc localhost 7890 

您的服務器將輸出

服務器:上得了端口36496


從127.0.0.1連接一些錯誤,雖然依然存在。

if(send(sockfd, message, sizeof(message), 0) == -1) { 

應該是相當

if(send(sock_client, message, sizeof(message) - 1, 0) == -1) { 

否則,服務器將郵件發送到自身。另外sizeof(message)包括最後的\0

最後,如果您想繼續接收超出第一個連接請求的連接請求,您不應該使用close(sockfd);

+0

這應該是一個評論,不是? – Tibrogargan

+0

耐心,你必須有我的年輕padawan,SCNR ;-) –

+0

紅燈相機說:「遊戲系統,你」 – Tibrogargan

0

正如你所說

直接在開始的消息不打印,以及

printf後添加fflush作爲

printf("HelloWorld"); 
fflush(stdout); 

有什麼圖書館缺失

我不這麼認爲,因爲您已成功編譯程序並創建了可執行文件,所以缺少任何庫。