This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

(C6678)使用NDK開發網路連線的問題



您好:

          我是使用 inc/socket.h 提供的 function 來開發網路功能,目前遇到一個問題如下:

          當有16個 client (PC) 連線到 server (C6678) 時,server與client端之間的傳送與接收功能都正常

          但是當有第17個以上的 client 連到 server 時,從C6678 可以看到連線成功,也有取得 socket number,並且第17個以上的 client 傳資料到 server 時,server也可以收得到。可是當 server 要回傳資料給這些 client 時卻送不出去,我們有在PC端監看網路封包確實沒看到 server 有送資料出來。不過此時 第1個 到 第16個 client 還是可以正常的與 server 進行資料的交換。

          想請問一下,為何第17個以上的連線,server 端只能接收資料,但是資料卻一直無法從 server端送到 client端呢?該如何解決這個問題呢?

          

  • 可以尝试一下追踪第17路代码,看看数据包有没有丢到发送端口。

  • 您好:

            我有採用FD_SET、fdSelect、FD_ISSET這幾個API來實作,並且是採用迴圈來實作,所以每路要做的事情都是一樣的。

            實作方式簡述如下:

            當server accpet 一個client連線時,會使用FD_SET。

            然後在傳送與接收會使用fdSelect與FD_ISET來看Server要與哪些client做資料交換

            n1 = fdSelect(max_fd + 1, &read_fds, NULL, NULL, &timeout)    <==  接收端,n1 = 17,read_fds->count = 17,第17個連線可正常接收資料

            n2 = fdSelect(max_fd + 1, NULL, &write_fds, NULL, &timeout)    <==  傳送端,n2 = 17,但是 write_fds->count = 16,第17個連線無法送出資料

            部分程式碼如下,請協助確認是否哪裡有問題,感謝!

    ===================================================

    FD_SET(stcp, &master);

    max_fd = (INT32)stcp;

     

    for(;;){

            /*** Handle TCP new connection ***/

            connect_fds = master;

            n0 = fdSelect(max_fd + 1, &connect_fds, NULL, NULL, &timeout);

            if(n0 > 0){

                    /* Set Port = Any, IP address = Any */

                    size = sizeof(sin1);

                    bzero(&sin1, sizeof(struct sockaddr_in));

                    stcp_child = accept(stcp, (PSA)&sin1, &size);

                    if(stcp_child != INVALID_SOCKET){

                            for(i = 0; i < CLIENT_MAX_NUM; i++){

                                    if(User_Info[i].Socket_Number == 0){

                                            User_Info[i].Socket_Number = (INT32)stcp_child;

                                            FD_SET(stcp_child, &slave);

                                            if((INT32)stcp_child > max_fd){ max_fd = (INT32)stcp_child; }

                                            stcp_child = INVALID_SOCKET;

                                            break;

                                    }

                            }

                    }

            }

     

            /*** TCP Receiver ***/

            read_fds = slave;

            n1 = fdSelect(max_fd + 1, &read_fds, NULL, NULL, &timeout);

            for(i = 0; (n1 > 0) && (i < CLIENT_MAX_NUM); i++){

                    if(FD_ISSET((HANDLE)User_Info[i].Socket_Number, &read_fds)){

                            bytes = (int)recv((HANDLE)User_Info[i].Socket_Number, (void *)rBuf, SERVER_RECV_BUF_SIZE, 0);

                            if(bytes > 0){

                                    ServerQuote_RxMsg_Handle(&User_Info[i], rBuf);

                                    memset(&rBuf[0], 0, bytes);

                            }else{

                                    fdClose((HANDLE)User_Info[i].Socket_Number);

                                    FD_CLR((HANDLE)User_Info[i].Socket_Number, &slave);

                            }

                            n1--;

                    }

            }

     

            /* TCP Transmitter */

            write_fds = slave;

            n2 = fdSelect(max_fd + 1, NULL, &write_fds, NULL, &timeout);

            for(i = 0; (n2 > 0) && (i < CLIENT_MAX_NUM); i++){

                    if(FD_ISSET((HANDLE)User_Info[i].Socket_Number, &write_fds)){

                            msgLen = Server_TxMsg_Handle(&User_Info[i], tBuf);

                            if(msgLen > 0){

                                    if(send((HANDLE)User_Info[i].Socket_Number, tBuf, msgLen, 0) == msgLen){

                                    }

                            }

                            n2--;

                    }

            }

    }

     ===================================================