0

これを行う単純なserver.cを作成します:

  1. ポート 7705 をリッスンします。
  2. 「Client-x」からの着信接続を受け入れます。
  3. 保留中の接続がない間、「Client-1」からデータを受信します。
  4. 別のクライアントからの保留中の接続がある場合は、2 番目のステップに進みます。

これがコードです

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

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno;
     socklen_t clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port ..\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        perror("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
         p error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
    accpt:
     while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) 
    {
    /* i don't know return value for "there is no pending connection" in accept() function, so i use -1 value" */
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
    ....... // Process data, and etc //
    }
    goto accept
     }
4

3 に答える 3

1

accept() 関数の「保留中の接続はありません」の戻り値がわかりません

1つもありません。受け入れる連絡があるまで戻りません。ブロックします。

于 2013-06-15T10:19:25.603 に答える
1

保留中の接続がない場合は戻りaccept ません。接続があるまでブロックし、その後戻ります。ソケットをノンブロッキングにすることですぐに復帰させることができますが、デフォルトではブロッキングであり、前述の動作が成り立ちます。

于 2013-06-15T03:18:20.987 に答える