Proszę o pomoc w znalezieniu odpowiedzi na pytanie z którym nie mogę sobie poradzić już od dłuższego czasu a dokłaniej to
o że mam przykładowy kod serwera który łączy się na porcie 1978 i jak testuje serwer telnetem wszystko jest ok tzn.
1.Wysyła do telneta "Internetowy Serwer Protokolu Puk-Puk Wersja 1.0 Puk-puk! "
2.Czeka na odpowiedz i jesli odpowiedz jest zla to odpowiada że powinno się zapytać kto tam.

i przy użyciu telnetu wszystko jest ok działa .

Natomiast jak pisze przerabiając inne źródło klienta robię tak :

read(sockfd,recv_buf, sizeof(recv_buf)+1); //czytam to co wyslal serwer
say(sockfd,"kto tam ?"); //wysyłam do niego informacje do serwer
printf(recv_buf); //wypisuje informacje z bufora
read(sockfd,recv_buf, sizeof(recv_buf)+1); // ponowinie czytam co wysłał serwer
printf(recv_buf); // wypisuje dane z bufora to co zczytał serwer

i tu mam problem a dokładniej to to dlaczego telnet wszytko czyta a moj klient juz nie wysyla dalej informacji
nie wiem o co chodzi proszę o podpowiedz ,bardzo mi na tym zależy ponieważ zaczyna się zbliżać termin sesji poprawkowej a ja jestem w lesie.

Poniżej kod serwera i klienta
SERWER

 
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
int catch_signal(int sig , void (*handler)(int));
void handle_shutdown(int sig);
int open_listener_socket();
void bind_to_port(int socket, int port);
int open_listener_socket();
void error(char *msg);
int say(int socket ,char * s);
int read_in(int socket , char * buf , int len);


int listener_d;

int main (int argc, char *argv[])
{
  if (catch_signal(SIGINT, handle_shutdown) == -1)   error("Nie mozna ustawic procedury obslugi przerwania");
  listener_d = open_listener_socket();
  bind_to_port(listener_d, 1978);
  if (listen(listener_d, 10) == -1)
    error("Nie mozna odbierac polaczen");
  struct sockaddr_storage client_addr;
  unsigned int address_size = sizeof(client_addr);
  puts("Czekam na polaczenie");
  char buf[255];
  char nazwa_pliku[255];
  char login[255];
  char haslo[255];

  while (1) {
    int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);

    if (connect_d == -1)
      error("Nie mozna otworzyc pomocniczego gniazda");

    if (!fork()) {
      close(listener_d);

      if (say(connect_d,"Internetowy Serwer Protokolu Puk-Puk\r\nWerska 1.0\r\nPuk-puk!\r\n> ")!= -1)
      {
    	  read_in(connect_d, buf, sizeof(buf));
        if (strncasecmp("Kto tam?", buf, 12))
          say(connect_d, "Powinienes zapytac: 'Kto tam?'!");
        else {
          if (say(connect_d, "Oskar\r\n> ") != -1) {
            read_in(connect_d, buf, sizeof(buf));
            if (strncasecmp("Jaki Oskar?", buf, 10))
              say(connect_d, "Powinienes zapytac: 'Jaki Oskar?'!\r\n");
            else
              say(connect_d, "Oskar, glupie pytanie, na kt¢re dostaniesz glupia odpowied«.\r\n");
          }
        }
      }
      close(connect_d);
      exit(0);
    }
    close(connect_d);
  }


  return 0;
}

int catch_signal(int sig , void (*handler)(int))
{
	struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flags = 0 ;
	return sigaction( sig, &action, NULL);
}

void handle_shutdown(int sig)
{
  if (listener_d)
    close(listener_d);

  fprintf(stderr, "Na razie!\n");
  exit(0);
}

void error(char *msg)
{
  fprintf(stderr, "%s: %s\n", msg, strerror(errno));
  exit(1);
}


int open_listener_socket()
{
  int s = socket(PF_INET, SOCK_STREAM, 0);
  if (s == -1)
    error("Nie mozna otworzyc gniazda");
  return s;
}

void bind_to_port(int socket, int port)
{
  struct sockaddr_in name;
  name.sin_family = PF_INET;
  name.sin_port = (in_port_t)htons(1978);
  name.sin_addr.s_addr = htonl(INADDR_ANY);
  int reuse = 1;
  if (setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)) == -1)
    error("Nie mozna ustawic opcji ponownego uzycia gniazda");
  int c = bind (socket, (struct sockaddr *) &name, sizeof(name));
  if (c == -1)
    error("Nie mozna utworzyc powiazania z gniazdem");
}

int say(int socket ,char * s)
{
	int result = send(socket ,s ,strlen(s),0);
	if(result == -1)
		fprintf(stderr,"%s: %s\n", "Blad komunikacji z serwerem",strerror(errno));
	return result;

}
int read_in(int socket , char * buf , int len)
{
	char * s = buf;
	int slen = len;
	int c = recv(socket,s,slen,0);
	while ((c > 0) &&  (s[c-1] !='\n'))
	{
		s=s+c ;
		slen=slen-c;
	}

	if (c < 0 )
			buf[0]='\0';
		else
			s[c-1]='\0';

	return len- slen ;
}


Klient

 

#include <iostream>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#define SERVER_PORT 1978
int say(int socket ,char * s);
int read_in(int socket , char * buf , int len);

int main (int argc, char *argv[])
{
   int    len, rc;
   int    sockfd;
   char   send_buf[255];
   char   recv_buf[255];
   char   recv_buf2[255];
   char zmienna[255];
   struct sockaddr_in   addr;

   /*************************************************/
   /* Utwórz gniazdo strumienia AF_INET             */
   /*************************************************/
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   if (sockfd < 0)
   {
      perror("socket");
      exit(-1);
   }

   /*************************************************/
   /* Inicjowanie struktury adresów gniazd          */
   /*************************************************/
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   addr.sin_addr.s_addr = htonl(INADDR_ANY);
   addr.sin_port   = htons(SERVER_PORT);

   /*************************************************/
   /* Połączenie z serwerem                         */
   /*************************************************/
   rc = connect(sockfd,
                (struct sockaddr *)&addr,
                sizeof(struct sockaddr_in));
   if (rc < 0)
   {
      perror("connect");
      close(sockfd);
      exit(-1);
   }
   printf("Połączenie nawiązane.\n");

   /*************************************************/
   /* Wpisanie do buforu danych do wysłania         */
   /*************************************************/

   read(sockfd,recv_buf, sizeof(recv_buf)+1);
   say(sockfd,"kto tam ?");
   read(sockfd,recv_buf, sizeof(recv_buf)+1);
   printf(recv_buf);

   /*************************************************/
   /* Zamknij gniazdo                               */
   /*************************************************/
   close(sockfd);
}

int say(int socket ,char * s)
{
	int result = send(socket ,s ,strlen(s)+1,0);
	printf("wysylam %i danych\n",strlen(s)+1);
	if(result == -1)
	{
		printf("Blad");
	}

	//	fprintf(stderr,"%s: %s\n", "Blad komunikacji z serwerem",strerror(errno));
	return result;
}

int read_in(int socket , char * buf , int len)
{
	char * s = buf;
	int slen = len;
	int c = recv(socket,s,slen,0);
	while ((c > 0) &&  (s[c-1] !='\n'))
	{
		s=s+c ;
		slen=slen-c;
	}

	if (c < 0 )
			buf[0]='\0';
		else
			s[c-1]='\0';

	return len- slen ;
}