2017-04-22 98 views
0

我的服務器出現問題。他無法將基本信息發送給客戶。 我認爲這個問題是在客戶端,因爲他不能接收發送郵件,但我不知道如何解決這個問題:/通過套接字進行C服務器 - 客戶端通信 - 如何將消息從服​​務器打印到客戶端

我的服務器:

int server(){ 
    int lis_soc,s,r; 
    struct sockaddr_un ad; 
    char buffer[MAXSIZE]; 

    lis_soc=socket(AF_UNIX,SOCK_STREAM,0); 
    memset(&ad,0,sizeof(ad)); 
    ad.sun_family=AF_UNIX; 
    strcpy(ad.sun_path,"./sock"); 

    unlink("./sock"); 
    bind(lis_soc,(struct sockaddr *) &ad,sizeof(ad)); 
    listen(lis_soc,10); 
    s=accept(lis_soc,0,0); 
    while(strcmp(buffer,"halt")!=0 && strcmp(buffer,"quit")!=0){ 
     char *pch=(char *)malloc(MAXSIZE); 

    bzero(buffer,MAXSIZE); 
    r=read(s,buffer,sizeof(buffer)); 
    strcpy(pch,buffer); 
    strtok(pch," "); 

    if(strcmp(buffer,"help")==0) get_help(s); //this is the funcion for print from server 
    else if(strcmp(buffer,"info")==0) get_info(); 
    else if(strcmp(buffer,"run")==0) run(); 
    else if(strcmp(pch,"ls")==0){ 
     if(strcmp(buffer,"ls")==0) ls(".",NULL); 
     else while ((pch = strtok (NULL, " ")) != NULL) {ls(pch,NULL);} 
    } 
    else system(buffer); 
    } 
    close(s); 
    printf("SERVER END OF CONNECTION\n"); 
    return 0; 
} 

我的客戶:

int client(){ 
    int s,r; 
    char buffer[MAXSIZE]; 
    char output[]="client: Enter data for server: "; 
    struct sockaddr_un ad; 

    s=socket(AF_UNIX,SOCK_STREAM,0); 
    memset(&ad,0,sizeof(ad)); 
    ad.sun_family=AF_UNIX; 
    strcpy(ad.sun_path,"./sock"); 

    connect(s,(struct sockaddr *) &ad,sizeof(ad)); 
    while(strcmp(buffer,"halt")!=0 && strcmp(buffer,"quit")!=0){ 
    bzero(buffer,MAXSIZE); 
    write(1,output,strlen(output)); 
    r=read(0,buffer,sizeof(buffer)); 
    buffer[r-1]='\0'; 
    write(s,buffer,strlen(buffer)); 
    } 
    close(s); 
    printf("CLIENT END OF CONNECTION\n"); 
    return 0; 
} 

功能get_help()從服務器調用:

void get_help(int lis_soc){ 
    char buffer[]="Ahoj client"; 
    write(lis_soc,&buffer,strlen(buffer)); 
} 

函數調用後獲得幫助沒有打印。爲什麼?

+0

你必須完全,正確處理結果返回所有的系統調用,如「連接()」和「閱讀()」。 – ThingyWotsit

+0

我正確編輯了我的代碼,但沒有發生任何錯誤,所有事情都正常運行。 – user3396072

回答

0

您的客戶端代碼不會讀取它從服務器獲取的消息。

我編譯並執行了你的代碼,仔細檢查是否是這個問題。

只需在客戶端的while循環的末尾添加read(s, ...);電話:

while(strcmp(buffer,"halt")!=0 && strcmp(buffer,"quit")!=0){ 
    bzero(buffer,MAXSIZE); 
    write(1,output,strlen(output)); 
    r=read(0,buffer,sizeof(buffer)); 
    buffer[r-1]='\0'; 
    write(s,buffer,strlen(buffer)); 
    read(s, buffer, sizeof(buffer)); 
    printf("Answer from server: %s\n",buffer); 
} 
+0

非常感謝你的問題。 :) – user3396072

+1

'緩衝區[r-1] ='\ 0''splats最後收到的字符。 – ThingyWotsit