2016-12-15 61 views
-1

我正在运行一个从命令行发送时区和测试服务器(我们知道有效)的客户端,它返回该时区的日期和时间。但是,返回时区后,正确地说,它会发生段错误。C Sockets问题

下面是我的客户端代码:

int main(int argc, const char * argv[]){ 
char buf[kBufSize+1]; 
char line[128]; 
ssize_t n; 
int i; 
int more; 
int x = 0; 

int sockFD; 
int port; 
struct sockaddr_in sad; 
struct hostent *ptrh; 

sockFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
memset(&sad, 0, sizeof(sad));     /* Sets every byte of the address to be zero */ 
    sad.sin_family = AF_INET; 

/* Look up name */ 
ptrh = gethostbyname(argv[1]); 
memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length); 

/* Set port */ 
//sscanf(argv[2], "%d", &port); 
port = atoi(argv[2]); 
//printf("%d",port); 
sad.sin_port = htons(port); 

int clifd = connect(sockFD, (struct sockaddr *)&sad, sizeof(sad)); 
if(clifd < 0) { 
    printf("[ERROR]: Error Connecting...\n"); 
    return 0; 
} 
printf("Number of args: %d\n", argc); 
x = 3; 

    //printf("Value of x: %d\n", x); 
    //printf("[DEBUG]: Value of X: %d\n", x); 

    //printf("[DEBUG]: Line: %s\n", line); 
    do 
    { 
     /* Read input line */ 
     do 
     { 
      more = 1; 
      n = read(sockFD, buf, kBufSize); 
      buf[n] = '\0'; // BUF IS READ FROM THE SERVER 

      if(n <= 0) 
       break; 

      for(i = 0; i < n; i++) 
      { 
       if(buf[i] == 10) 
       { 
        more = 0; 
        break; 
       } 
      } 

      printf("%s", buf); 

      if (buf == "BYE\r\n"){ 
       printf("Closing\n"); 
       exit(1); 
      } 

     } while(more); 

     if(n <= 0) 
     { 
     break; 
     } 
     strcpy(line, argv[x]); 
     strcat(line, "\r\n\0"); // LINE IS SENT TO THE SERVER 
     //printf("[DEBUG] Being sent: %s", line); 
     write(sockFD, line, strlen(line)); 
     //printf("%d", n); 
     //printf("Value of x: %d\n", x); 
     x++; 
    } while (n != 0 && x <= argc); 

    close(sockFD); 
    return 0; 
} 
+2

调试器,使用一个:) – KevinDTimm

+0

“* it segfaults。*”此外,英语语言依赖于上下文。 – alk

+2

你不能在C中比较字符串'buf ==“BYE \ r \ n”'使用'strcmp()'。 – alk

回答

0

argv数组从0到ARGC-1,但您使用的argv 3至ARGC。看看你的外部do/while循环的条件。