2013-12-22 3 views
1

У меня нормальное взаимодействие клиент-сервер, так же, как руководство Beej's вносит свой вклад в это.клиент получает странные символы с сервера, оригинального сообщения нет вообще

Сервер отправляет строку, но в recv на клиенте, хотя возвращаемое значение в порядке (то есть равно количеству байтов, отправленных с сервера), полученные символы являются полностью странными, а значение, возвращаемое strlen на принятой строке, меньше чем значение, возвращаемое recv.

Мне кажется очень странным, поэтому, если бы вы могли дать мне подсказку, было бы здорово.

Это часть кода сервера:

s_gateway_server = socket(PF_INET, SOCK_STREAM, 0); 

    memset(&server, 0, sizeof(server)); // asiguram padding-ul 
    server.sin_family = AF_INET; 
    server.sin_port = htons(is.port); 
    inet_pton(AF_INET, is.ip, &server.sin_addr); 

    status = connect(s_gateway_server, (struct sockaddr*) &server, sizeof(server)); 
    if(status == -1) 
    { 
     printf("ERROR\nNu te-ai putut conecta la server-ul %s :-(\n", is.ip); 
     goto exit; 
    } 

    l = strlen(msg) + 1; 
    status = send(s_gateway_server, &msg, l, 0); 
    if(status == -1) 
    { 
     perror("ERROR\nla send catre server"); 
     goto exit; 
    } 
    if(status < l) 
    { 
     //TODO trimite restul de pachet 
     printf("ERROR\npachet ajuns incomplet la server\n"); 
     goto exit; 
    } 

    printf("Am trimis %d octeti: %s\n", status, msg); 

И это часть кода клиента:

void send_and_receive(int sock) 
{ 
int status, ret; 

while(1) 
{ 
    char receivebuff[500]; 

    status = recv(sock, &receivebuff, 500, 0); 
    if(status == -1) 
    { 
     perror("ERROR\nla recv"); 
     continue; 
    } 
    if(status == 0) 
     // connection closed 
     break; 

(не вставить все функции), а функция вызывается в основной ():

int main(int argc, char **argv) 
{ 
int s_server_gateway, conn_s_server_gateway, ret; 
struct sockaddr_in gateway; 
socklen_t length; 

ret = parse_arg(argc, argv); 
if(ret) 
    return 1; 

s_server_gateway = listen_to_clients(); 
if(s_server_gateway < 0) 
    return 2; 

while(1) 
{ 
    length = sizeof(gateway); 
    conn_s_server_gateway = accept(s_server_gateway, (struct sockaddr *) &gateway, &length); 

    if(conn_s_server_gateway == -1) 
    { 
     perror("ERROR\nla accept de la gateway"); 
     continue; 
    } 

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

     send_and_receive(conn_s_server_gateway); 

     return 0; 
    } 
    else 
    { 
     close(conn_s_server_gateway); 

     continue; 
    } 
} 

close(s_server_gateway); 
return 0; 
} 


int listen_to_clients() 
{ 
int s_server_gateway, optval, ret; 
struct sockaddr_in server; 

s_server_gateway = socket(PF_INET, SOCK_STREAM, 0); 
if(s_server_gateway == -1) 
{ 
    perror("ERROR\nla deschidere socket"); 
    return -1; 
} 

memset(&server, 0, sizeof(server)); // asiguram padding-ul 
server.sin_family = AF_INET; 
server.sin_port = htons(port); 
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr); 

optval = 1; 
ret = setsockopt(s_server_gateway, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)); 
if(ret == -1) 
{ 
    perror("ERROR\nla setsockopt"); 
    close(s_server_gateway); 
    return -2; 
} 

ret = bind(s_server_gateway, (struct sockaddr *) &server, sizeof(server)); 
if(ret == -1) 
{ 
    perror("ERROR\nla bind"); 
    close(s_server_gateway); 
    return -3; 
} 

listen(s_server_gateway, BACKLOG); 
if(ret == -1) 
{ 
    perror("ERROR\nla listen"); 
    close(s_server_gateway); 
    return -4; 
} 

return s_server_gateway; 
} 
+0

Видя больше вашего клиента 'while (1), цикл может помочь. – chux

ответ

1

Неправильный параметр recv()

char receivebuff[500]; 
// status = recv(sock, &receivebuff, 500, 0) 
status = recv(sock, receivebuff, 500, 0); // no & 
// or better 
status = recv(sock, receivebuff, sizeof(receivebuff), 0); 
+0

То же самое здесь 'status = send (s_gateway_server, & msg, l, 0);'. – alk

+0

Спасибо! Теперь это работает. Но мне интересно, почему компилятор ничего не сказал? (Я скомпилирован с -Wall). Что еще более странно, так это то, что я использовал это раньше в более простых программах, и это сработало так, как написано в первый раз ... спасибо вам, в любом случае! – simm

+0

@simm Не полностью удовлетворен. Поскольку я избегаю '& array', это выглядело как ключевая необычная вещь. Тем не менее, я задаюсь вопросом о остальной части кода, когда вы определили, что полученные символы абсолютно странны, а значение, возвращаемое strlen на принятой строке, меньше ». – chux

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