2015-09-06 92 views
0

我正在編寫一個簡單的客戶端/服務器聊天程序在c。我不明白爲什麼一個程序有效,另一個程序沒有。下面是爲客戶端和服務器提供的程序。當我用兩個代碼中的bzero((char *)server,sizeof(server))替換bzero(&(server.sin_zero),8)時,會引發「傳輸端點未連接」的錯誤。他們已經實現了使用第二種方法,它在這個site工作。bzero在套接字編程中

Client.c 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <netinet/in.h> 

    int main() 
    { 
     struct sockaddr_in server; 
     int s1; 
     char message[500]; 

     server.sin_port = htons(5000); 
     server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
     server.sin_family = AF_INET; 
     bzero(&(server.sin_zero),8); 
     s1 = socket(AF_INET,SOCK_STREAM,0); 
     if(s1 == -1) { 
      perror("socket not created\n"); 
      exit(1); 
     } 
     if(connect(s1,(struct sockaddr *)&server,sizeof(server)) == -1) { 
      perror("not able to connect\n"); 
      exit(1); 
     } 

     int n = read(s1,message,500); 
     if(n < 0) { 
      perror("message not recieved\n"); 
      exit(1); 
     } 
     printf("%s\n",message); 
     close(s1); 
     return 0; 

    } 

這是服務器的程序。

Server.c 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <netinet/in.h> 

    int main() 
    { 
     struct sockaddr_in server,client; 
     int s1,s2,len; 
     char message[500]; 

     server.sin_port = htons(5000); 
     server.sin_addr.s_addr = INADDR_ANY; 
     server.sin_family = AF_INET; 
     bzero(&(server.sin_zero),8); 
     s1 = socket(AF_INET,SOCK_STREAM,0); 
     if(s1 == -1) { 
      perror("socket not created\n"); 
      exit(1); 
     } 
     if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) { 
      perror("socket not binded\n"); 
      exit(1); 
     } 
     if(listen(s1,5) == -1) { 
      perror("unable to listen"); 
      exit(1); 
     } 
     len = sizeof(struct sockaddr_in); 
     s2 = accept(s1,(struct sockaddr *)&client,&len); 
     printf("connected"); 
     if(s2 == -1) { 
      perror("unable to accept connection"); 
      exit(1); 
     } 
     strcpy(message,"you are connected"); 
     message[strlen(message)] = '\0'; 
     int n = write(s2,message,strlen(message)); 
     if(n < 0) { 
      perror("message not sent\n"); 
      exit(1); 
     } 
     close(s1); 
     close(s2); 
     return 0; 

    } 

回答

3
bzero(&(server.sin_zero),8) 

僅歸零出sin_zero陣列。

bzero((char*)server,sizeof(server)) 
,另一方面

,將清零整個struct,以此來重置您之前的設置值(如sin_port)。

最後,第一零出struct然後初始化(就像他們這樣做是在site you referred to;注重細節:-))。

+0

謝謝。這真的有幫助。 –