Неправильное содержимое буфера программирования клиентского сервера

0

Я набираю две программы для клиента и одну для сервера. сервер - это одновременный эхо- сервер tcp с выбором вызова, чтобы использовать только один процесс для всего клиента. он использует очевидный параллелизм.

Я разрабатываю программу и запускаю ее работу, но после 3/4 клиента обмена сообщениями и сервера обмена сообщениями. содержимое буфера на сервере изменяет его отображение текущего сообщения с каким-либо символом из предыдущего сообщения.

Я не понимаю, почему это происходит. Пожалуйста, любой, кто может мне помочь...

//Client Program

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <iostream>
using namespace std;

#define MAXLINE 4096 /*max text line length*/
#define serv_PORT 3000 /*port*/

int main(int argc,char **argv)
{
 int sockfd;
 struct sockaddr_in servaddr;
 char sendline[MAXLINE]; 
 char recvline[MAXLINE];
 /*int sendchars,recvchar;
 char buf[MAXLINE];
*/

if (argc !=2)
 {
  cerr<<"Usage: Femto: <IP address of the serv"<<endl;
  exit(1);
 }

//Create a socket for the client

if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0)
 {
  cerr<<"Problem in creating the socket"<<endl;
  exit(1);
 }

//Creation of the socket

 memset(&servaddr, 0, sizeof(servaddr));
 servaddr.sin_family = AF_INET;
 servaddr.sin_addr.s_addr= inet_addr(argv[1]);
 servaddr.sin_port =  htons(serv_PORT); 

//Connection of the client to the socket
 if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
 {
  cerr<<"Problem in connecting to the serv"<<endl;
  exit(1);
 }

while (fgets(sendline, MAXLINE, stdin) != NULL)
 {
  send(sockfd, sendline, strlen(sendline), 0);
   if (recv(sockfd, recvline, MAXLINE,0) == 0)
  {
    cerr<<"The serv terminated"<<endl;
    exit(1);
  }

   cout<< "String received from the serv: ";
   fputs(recvline, stdout);
 }

 exit(0);
}


//Server program

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


using namespace std;
#define MAXLINE 4096 /*max text line length*/
#define serv_PORT 3000 /*port*/
#define LISTENQ 65535 

int main (int argc, char **argv)
{
 int msock,ssock;
 fd_set rfds;
 fd_set afds;
 int fd,nfds;
 socklen_t client_len ;


 char buf[MAXLINE];
 struct sockaddr_in clientaddr, servaddr;

 if ((msock = socket (AF_INET, SOCK_STREAM, 0)) <0)
 {
 cerr<<"Problem in creating the socket"<<endl;
 exit(1);
   }

 servaddr.sin_family = AF_INET; 
 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 servaddr.sin_port = htons(serv_PORT);

 bind (msock, (struct sockaddr *) &servaddr, sizeof(servaddr));

 listen (msock, LISTENQ);

 nfds=getdtablesize();
 FD_ZERO(&afds);
 FD_SET(msock,&afds);

 while(1)
 {
 memcpy(&rfds,&afds,sizeof(rfds));
 if(select(nfds,&rfds,(fd_set *)0,(fd_set *)0,(struct timeval * )0)<0)
 {
 cerr<<"Error in select";
// exit(1);
 }


 if(FD_ISSET(msock,&rfds))
 {
 //int ssock;
 ssock= accept(msock,(struct sockaddr *)&clientaddr,&client_len);
  if(ssock<0)
  {
   cerr<<"Accept error";
  }
 FD_SET(ssock,&afds);
 }
 int n;
 for(fd=0;fd<nfds;++fd)
  if(fd!=msock && FD_ISSET (fd,&rfds))
    while ( (n = recv(fd, buf, MAXLINE,0)) > 0)  {
    cout<<"String received from and resent to the client:"<<endl;
    puts(buf);
    send(fd, buf, n, 0);
}
 close(fd);
 FD_CLR(fd,&afds);
  }
 }



output::

client-hi
server-hi

client-bye
server-bye

//after some message exchange
client-wru?
server-wru?

client- i m here
server-i am here u?
  • 0
    попробуйте очистить буфер перед отправкой данных с сервера каждый раз .. Может быть, это будет работать :) fflush (stdout)
  • 0
    @AxitSoni Сервер не использует stdout, поэтому очищать его было бы бессмысленно, и очистка буферов перед их отправкой также не имеет никакого смысла.
Теги:
networking
client-server

1 ответ

1

Вы делаете обычную ошибку, игнорируя счет, возвращаемый recv(). Данные в буфере действительны только до этого числа. Остальная часть не изменяется от предыдущего значения.

Вы также игнорируете возможность ошибки в bind(), listen(), send() и recv().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню