2015-08-08 2 views
1

Я пишу две небольшие тестовые программы на C (клиент/сервер), и у меня возникли проблемы с отправкой сообщений с сервера клиенту (но наоборот работает отлично). Сервер говорит, что он отправил 20 байтов, но на конце клиента говорится: «Не удалось получить данные». Буду признателен за любую помощь, большое спасибо! Мой код ниже:Клиент не может получать сообщения с сервера?

Сервер:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <netinet/in.h> 

int main(int argc, char* argv[]) 
{ 
    int sockfd, client_sockfd; 
    struct sockaddr_in server; 
    int reading, fileSize; 
    int i; //counter 
    int bytesSent; 
    char test[20] = "test message\n"; 

    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(argv[1])); //assign port to listen to 
    server.sin_addr.s_addr = INADDR_ANY; //IP address 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) //create socket failed 
    { 
     perror("socket"); 
     exit(1); 
    } 
    if(bind(sockfd, (struct sockaddr *) &server, sizeof(server)) == -1) //connect server socket to specified port 
    { 
     perror("bind call failed"); 
     exit(1); 
    } 

    //printf("listening to port %d\n", server.sin_port); 
    if(listen(sockfd, 5) == -1) //queue size of 5 
    { 
     perror("listen call failed"); 
     exit(1); 
    } 

    while(1) //infinite loop to process connections from clients 
    { 
     client_sockfd = accept(sockfd, NULL, NULL); //accept anything 
     if(client_sockfd == -1) 
    perror("accept call failed"); 
     bytesSent = send(client_sockfd, test, 20, 0); 
    printf("bytes sent: %d\n", bytesSent); 

    } 
    close(client_sockfd); 
    close(sockfd); 
    return 0; 
} 

Клиент:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <fcntl.h> 
#include <errno.h> 

int main(int argc, char* argv[]) 
{ 
    int sockfd; 
    struct sockaddr_in server; 
    struct hostent *server_ip_address; 
    server_ip_address = gethostbyname("eos-class.engr.oregonstate.edu"); 
    int sent; //number of bytes sent 
    int received; //number of bytes received 
    char passedMsg[20]; //holds received message 

    if(server_ip_address == NULL) 
    { 
     fprintf(stderr, "could not resolve server host name\n"); 
     exit(1); 
    } 
    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(argv[3])); //assign port to connect to 
    memcpy(&server.sin_addr, server_ip_address->h_addr, server_ip_address->h_length); 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) //create socket failed 
    { 
     perror("socket"); 
     exit(1); 
    } 

    if(connect(sockfd, (struct sockaddr *) &server, sizeof(server)) == -1) //connect socket to remote address failed 
    { 
     printf("tried to connect to port %d\n", server.sin_port); 
     perror("connect"); 
     exit(1); 
    } 

    if((received = recv(sockfd, passedMsg, 20, 0)) < 0); 
    { 
     printf("Failed to receive data\n"); 
     exit(1); 
    } 
    printf("Received message: %s\n", passedMsg); 
    close(sockfd); 

    return 0; 
} 
+0

опубликуйте сообщение об ошибке. И вы можете использовать пакеты захвата wirehark. – Ezio

+1

Вы также хотите добавить вызов 'perror()' в 'recv()' 'ветвь ошибки – alk

+0

OT: вы должны переместить вызов 'close (client_sockfd);' * в * серверы 'accept()' -loop. – alk

ответ

1

В коде клиента, в сообщении об ошибке проверки для recv, изменить printf к perror. Если вы это сделаете, то выход будет:

Не удалось получить данные: Успех

Так recv вызов был успешным, но код ошибки побежал в любом случае. Зачем? Давайте подробнее рассмотрим в этой if заявление:

       // what's this? ----v 
if((received = recv(sockfd, passedMsg, 20, 0)) < 0); 
{ 
    printf("Failed to receive data\n"); 
    exit(1); 
} 

Там в бездомную ; после условия в if заявлении. Это означает, что оператор if ничего не делает, если условие истинно и что следующий блок не является телом if, а независимым блоком, который всегда выполняется.

Избавьтесь от дополнительных ; и получите ожидаемые результаты.

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