2014-06-30 23 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:'新分配的内存块的内容未被初始化,剩下不确定的值'。我必须拼出来吗? –

相关问题