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 ;
}