簡體   English   中英

套接字編程C,將fork()改為select()

[英]Socket programming C, change fork() to select()

我是一名學生,我正在使用 TCP 協議在 C 中做一個客戶端/服務器項目。

服務器必須同時處理多個客戶端,我想實現 select() function 而不是 fork(),但我有點掙扎。 你有什么建議嗎?

謝謝!

客戶:

    ...

    if(connect(sock_client, (struct sockaddr*)&addr_server, sizeof(addr_server)) < 0){
        perror("Error in connection:\n");
        exit(1);
    }
    printf("Connected to MyServer.\n");

    while(true){
        printf("Client: \t");
        memset(bufferData.attractionName, 0, strlen(bufferData.attractionName));        // clear buffer
        scanf("%[^\n]%*c", bufferData.attractionName);              // get all words, not only the first

        send(sock_client, bufferData.attractionName, strlen(bufferData.attractionName), 0);

        if(strcmp(bufferData.attractionName, "!exit") == 0) {
            close(sock_client);
            printf("Disconnected from server.\n");
            exit(1);
        }

        if(recv(sock_client, bufferData.attractionName, MAX, 0) < 0) printf("Error in receiving data.\n");
        else printf("Server: \t%s\n", bufferData.attractionName);
    }
...

服務器:

while(true) {
        newSocket = accept(sockfd, (struct sockaddr*)&addr_new, &addr_size);

        if(newSocket < 0) exit(1);

        printf("/!\\ New Client connected (%s:%d)\n", inet_ntoa(addr_new.sin_addr), ntohs(addr_new.sin_port));
        
        /*
             Switch from fork to select here !
        */

        if((child_pid = fork()) == 0) {
            close(sockfd);

            while(true) {
                recv(newSocket, bufferData.attractionName, MAX, 0);
                    printf("Client message : %s\n", bufferData.attractionName);
                    strncpy(bufferData.attractionName, "Received\n", MAX);

                    send(newSocket, bufferData.attractionName, strlen(bufferData.attractionName), 0);
                    bzero(bufferData.attractionName, sizeof(bufferData.attractionName));
            }
        }
    }

當您使用多個分叉的進程時,每個進程都在其特定的套接字上等待消息,您通常會阻塞read()

當您使用單個進程時,通常會阻塞select()

在偽代碼中:

for (number of sockets) {
   open (socket)
   fork()
      // dedicated process here
      wait (for something to read on that socket)
      read(message from that socket) // blocking read
      process message
}

在一個進程中完成所有操作意味着您必須在select()中等待:

for (number of sockets) {
  open (socket)
  add socket to select set
}

do {
    select (on select set) // wait for anything on all sockets
    identify socket to read from
    read message from that socket (should never block)
    process message
} done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM