简体   繁体   中英

Client can't receive messages from server?

I'm writing 2 small test programs in C (client/server) and I'm having trouble sending messages from the server to the client (but the other way around works just fine). The server says it sent 20 bytes, but on the client's end it says "failed to receive data". I would appreciate any help, thank you so much! My code is below:

Server:

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

Client:

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

In your client code, in the error checking for recv , change printf to perror . If you do, the output will be:

Failed to receive data: Success

So the recv call was successful, but the error code ran anyway. Why? Let's take a closer look at that if statement:

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

There's a stray ; after the condition in the if statement. This means that the if statement does nothing if the condition is true, and that the following block is not the body of the if but an independent block that always runs.

Get rid of the extra ; and you get the expected results.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM