2014-06-30 24 views
1

如果我運行我的下面的套接字服務器程序,它不會等待客戶端在「接受」階段的連接,而是開始運行在無限循環中。我的節目被保存爲server.c,我試圖在命令行中使用下面的命令來運行它:套接字服務器程序不等待客戶端處於「接受」階段並在無限循環中運行

$ ./server /tmp/socket 

全套接字服務器代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <unistd.h>  



int server (int client_socket) 
{ 
    while (1) { 
     int length; 
     char* text;    

     if (read (client_socket, &length, sizeof (length)) == 0) 
      return 0; 

     text = (char*) malloc (length); 

     read (client_socket, text, length); 
     printf ("%s\n", text); 

     free (text); 

     if (!strcmp (text, "quit")) 
      return 1; 
    } 
} 


int main (int argc, char* const argv[]) 
{ 
    const char* const socket_name = argv[1];     
    int socket_fd; 
    struct sockaddr_un name; 
    int client_sent_quit_message;   
    socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); 

    name.sun_family = AF_LOCAL; 
    strcpy (name.sun_path, socket_name); 
    bind (socket_fd, (struct sockaddr*)&name, SUN_LEN (&name)); 

    listen (socket_fd, 5); 

    do { 
     struct sockaddr_un client_name; 

     socklen_t client_name_len; 
     int client_socket_fd; 

     client_socket_fd = accept (socket_fd, &client_name, &client_name_len); 
     client_sent_quit_message = server (client_socket_fd); 

     close (client_socket_fd); 
     } 
    while (!client_sent_quit_message); 

    close (socket_fd); 
    unlink (socket_name); 
    return 0; 
} 
+0

'爲什麼我們需要寫下面三行?'你知道一些'C'的基本概念嗎? 'malloc'和'free'是'c'的基本概念。用[這個鏈接]刷新你的想法(http://www.programiz.com/c-programming/c-dynamic-memory-allocation) –

+0

理解malloc和free很容易,但是你能解釋這些行是如何實際的加工? @Jayesh – user3751012

+0

如果你很容易理解你,那麼只要使用它即可。你一定有想法。 –

回答

1

試試下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <unistd.h>  
int server (int client_socket) 
{ 
    while (1) { 
    int length=30; 
    char* text;    
    text = (char*) malloc (length); 
    if (read (client_socket, text, length) == 0) 
     return 0; 
    printf ("%s\n", text); 
    if (!strcmp (text, "quit")) 
    { 
     free(text); 
     return 1; 
    } 
    free (text); 
    } 
} 
int main (int argc, char* const argv[]) 
{ 
    const char* const socket_name = argv[1];     
    int socket_fd; 
    struct sockaddr_un name; 
    int client_sent_quit_message;   
    socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); 
    name.sun_family = AF_LOCAL; 
    strcpy (name.sun_path, socket_name); 
    bind (socket_fd, (struct sockaddr*)&name, SUN_LEN (&name)); 
    listen (socket_fd, 5); 
    do { 
    struct sockaddr_un client_name; 
    int client_name_len=sizeof(struct sockaddr_un); 
    int client_socket_fd; 
    client_socket_fd = accept (socket_fd,(struct sockaddr *)&client_name, &client_name_len); 
    client_sent_quit_message = server (client_socket_fd); 
    close (client_socket_fd); 
} 
    while (!client_sent_quit_message); 
    close (socket_fd); 
    unlink (socket_name); 
    return 0; 
} 

錯就錯在接受功能你沒有類型轉換的sockaddr_unsockaddr *,那麼第三個參數是無效的,我們ç不是直接將socklen_t轉換爲socklen_t *,而是將該值存儲爲整數並將該指針作爲參數。

不使用此類型長度:
讀(client_socket,&長度,的sizeof(長度));

它從套接字讀取輸入並嘗試在&長度中分配,然後嘗試將該值存儲在字符變量中,那時會根據長度給出錯誤或讀取長度。

+1

在從原始代碼複製的'server()'中有文字使用後可用。 – thuovila

+0

@thuovila,謝謝。我糾正了我的錯誤。 – Chandru

+0

Ahem ..'printf(「%s \ n」,text)'。 malloc:'新分配的內存塊的內容未被初始化,剩下不確定的值'。我必須拼出來嗎? –

相關問題