2

次のコードを使用して、クライアントからサーバーソケットでデータを受信しようとしています。

server.c

int startServer(uint16_t myPort)
{
  int listenFd = 0, connfd = 0;
  struct sockaddr_in serv_addr;

  listenFd = socket(AF_INET, SOCK_STREAM, 6);
  if (listenFd == -1) {
    perror("socket");
    return EXIT_FAILURE;
  }

  memset(&serv_addr, '0', sizeof(serv_addr));

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons(myPort);

  if (-1 == bind(listenFd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) {
    perror("bind");
    return EXIT_FAILURE;
  }

  if (-1 == listen(listenFd, 10)) {
    perror("listen");
    return EXIT_FAILURE;
  }

  printf("Server listening on %d\n", myPort);

  int n = 0, k;
  char recvBuff[1024];
  struct sockaddr_in conn_addr;
  unsigned int len = sizeof(conn_addr);

  while(1)
  {
     connfd = accept(listenFd, (struct sockaddr*)NULL, NULL);

     n = recv(connfd, &recvBuff, 1023, 0);
     printf("Recd: %d bytes\n",n);
     for (k=0; k<16; ++k) { printf("%d: 0x%02X, ", k, recvBuff[k]); }

     sleep(1);
   }
}

およびclient.c

int main(int argc, char *argv[])
{
    int sockfd = 0, n = 0;
    struct sockaddr_in serv_addr; 

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    } 

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 

    uint32_t dataVal = 0xa0b0c0d0;
    int res = write(sockfd, (void*)&dataVal, sizeof(dataVal));
    printf("%d bytes sent\n", res);
    close(sockfd);
    return 0;
}

ただし、これを使用すると、サーバーがバイトを受信したと言っているのがわかりますが、その後のバイトの出力(forループ内)は実行されていないようです。私がここで間違っていることを誰かが知っていますか?

4

1 に答える 1

3

for ループの後に追加printf("\n");するか、for ループ内の printf に "\n" を追加します。

printfに書き込みstdout、バッファリングされます。これは、バッファがいっぱいになるか、フラッシュされるか、または改行が送信されるまで、出力が表示されないことを意味します。そのため、改行を送信して出力を確保するのが最も簡単です。

于 2012-10-17T07:35:24.167 に答える