客户端无法从服务器接收消息?

时间:2015-08-08 02:26:34

标签: c sockets unix

我在C(客户端/服务器)中编写了2个小型测试程序,而且我在从服务器向客户端发送消息时遇到问题(但反之亦然)。服务器说它发送了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;
}

1 个答案:

答案 0 :(得分: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的主体,而是始终运行的独立块。

摆脱额外的;并获得预期的结果。