Я написал некоторый код на C для TCP-сервера, который отражает все, что он получает.Проблема в том, что когда я отправляю данные в первый раз, они отражают их, а в следующий раз сервер отправляет обратно первый отправленный мной пакет.Журнал выглядит так:
Client Send : Packet1
Server reply : Packet1
Client Send : Packet2
server reply : Packet1
Код сервера выглядит следующим образом:
int main(int argc, char** argv) {
int listenfd,connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in servaddr,cliaddr;
listenfd = socket(AF_INET,SOCK_STREAM,0);
printf("Socket listenfd : %d with %d And %d\n",listenfd,AF_INET,SOCK_STREAM);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
printf("Server address: %d\n",servaddr.sin_addr.s_addr);
bind(listenfd, (SA*) &servaddr, sizeof(servaddr));
printf("Listened: %d\n",listenfd);
listen(listenfd,LISTENQ);
printf("After Listening: %d\n",listenfd);
int num=0;
for( ; ; ){
clilen=sizeof(cliaddr);
connfd = accept(listenfd, (SA*) &cliaddr,&clilen);
printf("Client no. %d connected\n",++num);
if( (childpid=fork())==0){
close(listenfd);
echo(connfd);
exit(0);
printf("Client no. %d Terminated\n",++num);
}
close(connfd);
}
return (EXIT_SUCCESS);
}
И моя функция эха:
void echo(int sockfd) {
ssize_t n;
char buf[MAXLINE];
again:
while ( (n = read(sockfd, buf, MAXLINE)) > 0)
writen(sockfd, buf, n);
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
printf("read error");
}
код клиента main:
int main(int argc, char** argv) {
int sockfd;
struct sockaddr_in servaddr;
sockfd= socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port= htons(SERV_PORT);
inet_pton(AF_INET,"0.0.0.0",&servaddr.sin_addr);
printf("%d , %d \n",sockfd,servaddr.sin_addr.s_addr);
connect(sockfd, (SA*) &servaddr,sizeof(servaddr));
printf("%d\n",sockfd);
replyBack(stdin,sockfd);
printf("RETURN\n");
return (EXIT_SUCCESS);
}
функция replyBack:
void replyBack(FILE *fp, int sockfd) {
char sendline[MAXLINE], recvline[MAXLINE];
printf("ENTER YOUR ECHOED: \n");
while (fgets(sendline, MAXLINE, stdin) != NULL) {
write(sockfd, sendline, sizeof(sendline));
if (read(sockfd, recvline, MAXLINE) == 0)
{
printf("str_cli: server terminated prematurely");
exit(-1);
}
fputs(recvline, stdout);
}
}