2011-12-20 3 views
-1

При работе в клиент-серверном программировании я передал 3 строки в клиенте, которые будут получены сервером, и он должен быть напечатан там 3 раза. (т. е. я использовал цикл «для», который будет выполнять операции записи & на стороне клиента & соответственно.), но на сервере печатается только первая строка.Почему я не могу прочитать несколько строк в файле сервера?

Пожалуйста, объясните,

Вот мой код

server.c

#include "head.h" 

void readstr(int connfd ,char [][20]); 
//void writestr(char * ,int); 

int main(int c ,char *v[]) 
{ 
     int  sd,connfd,retbind; 
     struct sockaddr_in serveraddress ,cliaddr; 
     socklen_t len; 
     char buf[100] ,databuf[1024][4]; 
     sd =socket(AF_INET ,SOCK_STREAM ,0); 
     if (sd<0) 
     { 

       exit(1); 
     } 
     memset(&serveraddress ,0 ,sizeof(serveraddress)); 
     serveraddress.sin_family =AF_INET; 
     serveraddress.sin_port =htons(MYPORT); 
     serveraddress.sin_addr.s_addr =htonl(INADDR_ANY); 
     retbind =bind(sd ,(struct sockaddr*)&serveraddress ,sizeof(serveraddress 
)); 
     if(-1 ==retbind) 
     { 
       perror("bind fails "); 
       exit(0); 
     } 
     listen(sd ,4); 
     for(;;) 
     { 
     printf("i am waiting for client\n"); 
     len =sizeof(cliaddr); 
     connfd = accept(sd ,(struct sockaddr*)&cliaddr ,&len); 
     if(connfd <0) 
     { 
     if(errno ==EINTR) 
     printf("interrupt"); 
     continue; 
     } 
     printf("connection from %s\n",inet_ntop(AF_INET ,&cliaddr.sin_addr,buf , 
sizeof(buf))); 
     readstr(connfd ,databuf); 
     close(connfd); 
     printf("\n fini one clieni"); 
     } 
     return 0; 
} 

void readstr(int connfd ,char str[3] [20]) 
{ 
     int pointer=0 ,i=0, n,pos=0; 
     memset(str ,'\0',sizeof(str)); 
     printf("\n->Connfd : %d\n",connfd); 
     printf("\n----->String recieved : %s\n",str); 
     for(i=0;i<3;i++) 
     { 
     while((n=read(connfd ,str[i] ,20)) >>0) 
     { 
       printf("Looping while\n"); 
       pos =pos +n; 

     } 
     str[i][pos] ='\0'; 
     } 
     for(i=0;i<3;i++) 
     { 
       printf("\n%s",str[i]); 
     } 
} 

client.c

#include "head.h" 
void send1(int ,char*); 

int main(int c,char*v[]) 
{ 
     int sd,i; 
     int len; 
     char buf[20][4]; 
     struct sockaddr_in serveraddress; 
     sd = socket(AF_INET ,SOCK_STREAM ,0); 
     if (sd<0) 
     perror("socket"); 
     memset(&serveraddress ,0 ,sizeof(serveraddress)); 
     serveraddress.sin_family =AF_INET; 
     serveraddress.sin_port =htons(atoi(v[1])); 
     serveraddress.sin_addr.s_addr =inet_addr(v[2]); 

     if(connect(sd,(struct sockaddr*)&serveraddress ,sizeof(serveraddress)) < 
0) 

     { 
       printf("cannot connect to server"); 
       exit(1); 
     } 
     for(i=0;i<3;i++) 
     { 
       memset(buf ,'\0',sizeof(buf)); 
       printf("\n string"); 
       fgets(buf[i],20,stdin); 
       len =strlen(buf[i]); 
       if(buf[i][len] =='\n') 
        buf[i][len]='\0'; 

     //  scanf("%s",buf[i]); 
       send1(sd ,(char *)buf); 
     } 
     shutdown(sd ,SHUT_WR); 
} 

void send1(int sd ,char *str) 
{ 

     int n ,byteswritten =0, wr; 
     char buf[1024]; 
     strcpy(buf ,str); 
     n =strlen(buf); 
     while(byteswritten < n) 
     { 
     printf("\nStart writing in client side\n"); 
     wr = write(sd , buf+byteswritten ,(n-byteswritten)); 
     byteswritten+=wr; 
     } 
     printf("\n string sent %s" ,buf); 

} 

ответ

1

В client.c главная:

char buf[20][4]; 

изменение:

char buf[4][20]; 

В server.c readstr:

while((n=read(connfd ,str[i] ,20)) >>0) 

изменение:

while((n = read(connfd, &str[i][pos], 20)) > 0) 

pos должен быть сброшен в 0 внутри for петля.

Кроме того, клиент считывает 3 строки по 20 символов каждый из stdin и записывает их в сокет. Сервер ожидает 3 строки ровно по 20 символов.

Вы должны либо использовать какой-либо разделитель записи, например \ n, в своем сетевом протоколе, либо использовать фиксированную длину, т. Е. Вводить строки ввода до 20 символов.

В вашем коде может быть больше ошибок, я перестала искать их.

0

Прошло более 1 часа на SO, и у вас нет ответа .. к тому, что кажется очень простой проблемой (странный подвиг). ты знаешь почему?

  • потому что очень больно проходить через ваш код.

    • документ это!
    • делят его на модули - init_net(), form_pkt(), send_pkt(), выход(), .. и т.д.
  • описать вашу проблему должным образом.

    • Сколько клиентов вы используете?
    • что происходит после того, как только первые строки печатаются. вы кодируете остановки, петли навсегда что?
    • вы смотрели через инструмент захвата пакетов, как TCPDUMP, Wireshark и т.д.
  • и прежде, чем я к главной проблеме .. Я вижу такие вещи, как «databuf [1024] [4]» передается в функция readstr() с формальными аргументами "char str [3] [20]".

    • пару советов
      • запустить свой код через статический анализатор инструмент для поиска основных предупреждений.
      • строки не являются отличной идеей для отправки по сети, узнать, как определить структуру пакета с частью заголовка и данных и т. Д.
      • также я считаю, что вы ищете пакет, такой как связь, а не поток. понять разницу!

Я не знаю ответа на этот вопрос, если вы представить его должным образом. на этот раз и каждый раз.

Смежные вопросы