亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2205 | 回復(fù): 6
打印 上一主題 下一主題

select解決批量輸入問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-07-15 21:52 |只看該作者 |倒序?yàn)g覽
網(wǎng)絡(luò)編程里面,講到select如果采用fgets從客戶端輸入數(shù)據(jù),讀入到套接字然后從服務(wù)器回射,但是這種方式存在一個(gè)問題,當(dāng)批量輸入的時(shí)候,也就是
   if(FD_ISSET(fileno(fp), &rset))
{
        if(fgets(sendline, MAXLINE, fp) == NULL)
                err_sys("fgets");
        if(write(sockfd, sendline, strlen(sendline)) < 0)
                err_sys("write");
}
比如執(zhí)行命令:cat txt | ./client 192.168.197.10 > t ,txt文件是個(gè)很大的文件,數(shù)據(jù)量很多,但是重定向輸入輸出會(huì)使輸出文件明顯的<輸入文件,原因呢,書上說“問題的起因在于我們對(duì)標(biāo)準(zhǔn)輸入中的EOF的處理,str_cli函數(shù)就此返回到main函數(shù),main函數(shù)終止,然而在批量方式下,標(biāo)準(zhǔn)輸入中的EOF并不意味著我們同時(shí)也完成了從套接字的讀入;可能仍有請(qǐng)求在去往服務(wù)器的路上,或者仍有應(yīng)答在返回客戶的路上。”
上面這句話有點(diǎn)不太好理解,我的想法是這樣子的,既然是批量輸入,那也是一個(gè)個(gè)輸入,那批量輸入到結(jié)尾了是不是也是順序的送到服務(wù)器的呢?同樣的,既然此時(shí)closed,要發(fā)送一個(gè)FIN過去,那發(fā)送FIN過去是順序(也就是在發(fā)送數(shù)據(jù)之后),還是并發(fā)的(也就是獨(dú)立發(fā))?當(dāng)服務(wù)器收到這個(gè)EOF,當(dāng)然此時(shí)也有從服務(wù)器到客戶端的數(shù)據(jù)在路上,如果按書上的介紹,難道是這個(gè)意思,服務(wù)器發(fā)送ACK+FIN的速度是光速過去一舉超越了他在路上發(fā)往客戶端的數(shù)據(jù)?
也就是可不可以這么理解,發(fā)送數(shù)據(jù)走的是公路,但是發(fā)送FIN是開飛機(jī)過去的?然后對(duì)方知道了就把在路上的數(shù)據(jù)都放棄了是這樣子嗎?

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-07-16 09:50 |只看該作者
標(biāo)準(zhǔn)輸入自帶緩沖。。 對(duì)于sockfd和文件fd, 標(biāo)準(zhǔn)輸出輸出是全緩沖。結(jié)合這個(gè)你想想。  
或者你把代碼帖完整。。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-07-16 09:53 |只看該作者
回復(fù) 2# fdl19881

客戶端和服務(wù)器的連接代碼應(yīng)該不用了哈嘿嘿
    void str_cli(FILE *fp, int sockfd)
{
        int maxfdp1;
        fd_set rset;
        char sendline[MAXLINE], recvline[MAXLINE];
       
       
        FD_ZERO(&rset);
        for(; {
                FD_SET(fileno(fp), &rset);
                FD_SET(sockfd, &rset);
                maxfdp1 = max(fileno(fp), sockfd) + 1;
                if(select(maxfdp1, &rset, NULL, NULL, NULL) < 0)
                        err_sys("select";

                if(FD_ISSET(sockfd, &rset))
                {
                        memset(recvline, 0, sizeof(recvline));
                        if(read(sockfd, recvline, MAXLINE) == 0)
                                err_quit("str_cli:server terminated prematurely";
                        fputs(recvline, stdout);
                }
               
                if(FD_ISSET(fileno(fp), &rset))
                {
        //                memset(sendline, 0, sizeof(sendline));
                        if(fgets(sendline, MAXLINE, fp) == NULL)
                                err_sys("fgets";
                        if(write(sockfd, sendline, strlen(sendline)) < 0)
                                err_sys("write";
                }
        }
}

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-07-16 10:10 |只看該作者
本帖最后由 fdl19881 于 2012-07-16 10:15 編輯

你這個(gè)沒問題呀,,, 我看過有問題應(yīng)該是:
if(FD_ISSET(fileno(fp), &rset))
                {
        //                memset(sendline, 0, sizeof(sendline));
                        if(fgets(sendline, MAXLINE, fp) == NULL)
                                return ; //這應(yīng)該是return吧
                         if(write(sockfd, sendline, strlen(sendline)) < 0)
                                err_sys("write";
                }

如果改成return, 那就會(huì)出問題了。從fp中讀完后,發(fā)送到sockfd中, 然后函數(shù)就結(jié)束了,那確實(shí)可能還有數(shù)據(jù)你沒收到,但你的函數(shù)返回最后結(jié)束 了。
你自己想想,如果客戶端與服務(wù)器端的延時(shí)很高,比如1s, 這個(gè)從ping命令一般也有幾十ms,
那么fget從文件中讀取在1s內(nèi)就結(jié)束了, 然后你的程序也就結(jié)束了, , 但是1s中服務(wù)器收到后發(fā)送過來的數(shù)據(jù)還在路上。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-07-16 10:19 |只看該作者
函數(shù)中的fp對(duì)應(yīng)的是文件! 文件讀完了,你還不能馬上返回,還得再等待一段時(shí)間(因?yàn)樽x取文件并write到sockfd的速度是很快的,而服務(wù)器和客戶端之間是有個(gè)RTT時(shí)間的,總是有個(gè)先后), 等你發(fā)送出去的,然后反射回來的數(shù)據(jù)全部接收完成 。不存在什么發(fā)送FIN, 路上什么的說法。
那里返回0并不是函數(shù)出錯(cuò),不應(yīng)該用err_sys,而應(yīng)該是return ;

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-07-16 11:48 |只看該作者
回復(fù) 5# fdl19881


    您的意思是不是這樣子:當(dāng)我們客戶讀到最后一行之后,函數(shù)終止,客戶端close掉所有的套接字,同時(shí)也關(guān)閉了從服務(wù)器的讀端口。這樣子使得傳輸過程中還有許多的數(shù)據(jù)沒有發(fā)送完或者沒有讀完。然后客戶端close套接字,就開始了與服務(wù)器的tcp四次終止過程了?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-07-16 13:08 |只看該作者
客戶端讀*文件* 讀完后,根據(jù)程序流程就會(huì)結(jié)束了! 但是從文件中讀取完了,不代表客戶端就把那些數(shù)據(jù)都從服務(wù)器端收完了。∵@時(shí)候可能還有數(shù)據(jù)正在去服務(wù)器的路上,或者正在被服務(wù)器收到處理, 或者服務(wù)器已經(jīng)發(fā)送了數(shù)據(jù)在返回的路上,但是或者客戶端已經(jīng)接收到了,但是程序已經(jīng)不會(huì)再執(zhí)行read了, 并將要執(zhí)行close了。


zhjl616 發(fā)表于 2012-07-16 11:48
回復(fù) 5# fdl19881
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP