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

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

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 10044 | 回復(fù): 10
打印 上一主題 下一主題

[C] Tcp傳輸大文件問(wèn)題請(qǐng)教! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-07-07 13:55 |只看該作者 |倒序?yàn)g覽
本帖最后由 mikzh 于 2011-07-07 13:56 編輯

使用Windows作為客戶(hù)端,Linux作為服務(wù)端;

代碼純 C 書(shū)寫(xiě);

傳送超過(guò)20K的文件時(shí),并將文件寫(xiě)入到服務(wù)端同一文件中,總是會(huì)少一些字節(jié)。

經(jīng)過(guò)抓包,在 Windows發(fā)送端的包,和Linux接收端的包是一樣的。說(shuō)明傳輸過(guò)程中沒(méi)有丟包;

一直懷疑是否是文件發(fā)送/接收的速度太快,而Linux端寫(xiě)文件速度太慢導(dǎo)致的。

但是,就算是寫(xiě)得慢,Socket也會(huì)將未寫(xiě)完的字符存入緩存中, 之后慢慢寫(xiě)。

那么,消失的字節(jié)數(shù)哪里去了?

請(qǐng)高人指點(diǎn)一下。

謝謝!

附上代碼:
說(shuō)明:為了大家看得不那么亂,網(wǎng)絡(luò)連接之類(lèi)的代碼省略了。

接收端:

  1. FILE * fp = fopen("xx.exe","ab+");
  2. while(1)
  3. {
  4.         recvInt = recv( new_fd, recv_buf, sizeof(file_info), 0 );
  5.         if(fp!=NULL)
  6.         {
  7.                 if (fwrite(recv_info.f_data, 1, recvInt , fp ) )
  8.                         fflush(fp);                        //此處是否會(huì)影響性能,每寫(xiě)入一點(diǎn)數(shù)據(jù)就更新一次緩存
  9.         }
  10. }
復(fù)制代碼
發(fā)送端:

  1. if( (err = fopen_s(&sendFp,fPath,"rb") != 0 ))
  2.                 perror("Cannot open this file");
  3.                
  4. while(1)
  5. {

  6.         sendInt = fread( fData, 1, sizeof(fData), sendFp);               
  7.         memcpy(sendBuf,fData,sizeof(fData));
  8.         if( send(sockfd, sendBuf, nNumRead + 141, 0 ) == -1)
  9.         {
  10.                
  11.                 perror("[Send Error]");
  12.                 getchar();
  13.                 exit(1);
  14.         }
  15. }
復(fù)制代碼

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
2 [報(bào)告]
發(fā)表于 2011-07-07 14:16 |只看該作者
使用Windows作為客戶(hù)端,Linux作為服務(wù)端;

代碼純 C 書(shū)寫(xiě);

傳送超過(guò)20K的文件時(shí),并將文件寫(xiě)入到服 ...
mikzh 發(fā)表于 2011-07-07 13:55



最后一包fdata里到底有多少字節(jié)要發(fā)?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-07-07 14:22 |只看該作者
回復(fù) 2# yulihua49

寫(xiě)錯(cuò)了,應(yīng)改成 fread的結(jié)果值: sendInt。

本意是讀到多少發(fā)多少。

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
4 [報(bào)告]
發(fā)表于 2011-07-07 14:32 |只看該作者
回復(fù)  yulihua49

寫(xiě)錯(cuò)了,應(yīng)改成 fread的結(jié)果值: sendInt。

本意是讀到多少發(fā)多少。
mikzh 發(fā)表于 2011-07-07 14:22



    那么,對(duì)端讀多少?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-07-07 14:40 |只看該作者
回復(fù) 4# yulihua49


對(duì)端也是讀這么多的。

我將發(fā)送buf定長(zhǎng)了,長(zhǎng)度為1024字節(jié)。


對(duì)端讀到的,也是 recv實(shí)際得到的。

會(huì)不會(huì)這個(gè)有差異,發(fā)送的和recv的會(huì)不會(huì)有問(wèn)題,導(dǎo)致數(shù)據(jù)不全?

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
6 [報(bào)告]
發(fā)表于 2011-07-07 15:00 |只看該作者
回復(fù)  yulihua49


對(duì)端也是讀這么多的。

我將發(fā)送buf定長(zhǎng)了,長(zhǎng)度為1024字節(jié)。


對(duì)端讀到的,也 ...
mikzh 發(fā)表于 2011-07-07 14:40



    要先發(fā)一個(gè)長(zhǎng)度,好讓對(duì)方知道讀多少。讀不夠這個(gè)數(shù),就再讀。就不會(huì)丟了。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-07-07 15:06 |只看該作者
回復(fù) 6# yulihua49

OK。我先試試。

我是將文件放在數(shù)據(jù)結(jié)構(gòu)中發(fā)過(guò)去的

結(jié)構(gòu)定義

{
unsigned int send_flag;
unsigned int file_size;
char file_name[32];
char file_path[64];
char send_buf[920];
}

這樣,控制發(fā)送長(zhǎng)度為 1024.
但是,剛才測(cè)試的時(shí)候,發(fā)現(xiàn)讀取的時(shí)候有分片。

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
8 [報(bào)告]
發(fā)表于 2011-07-07 15:10 |只看該作者
一次send不一定能把你想要發(fā)送的數(shù)據(jù)發(fā)送完成,檢查下send的返回值

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-07-07 15:11 |只看該作者
回復(fù) 6# yulihua49


    有沒(méi)有例子讓我參考參考,謝謝!

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
10 [報(bào)告]
發(fā)表于 2011-07-07 16:01 |只看該作者
本帖最后由 yulihua49 于 2011-07-07 16:11 編輯
回復(fù)  yulihua49


    有沒(méi)有例子讓我參考參考,謝謝!
mikzh 發(fā)表于 2011-07-07 15:11

這是我的包頭:
  1. #define HEADPACKLENGTH 48

  2. #define         PARANUM 9
  3. #define         PROTO_NUM   para[0]             /*協(xié)議號(hào):
  4.                                         客戶(hù)呼叫服務(wù)器時(shí)是調(diào)用號(hào),
  5.                                         服務(wù)器返回時(shí)是事件號(hào),1-65535 */
  6. #define         ERRNO1      para[1]             /*主錯(cuò)誤碼      */
  7. #define         ERRNO2      para[2]             /*輔助錯(cuò)誤碼    */
  8. #define         PKG_REC_NUM para[3]             /*數(shù)據(jù)記錄數(shù)    */
  9. #define         PKG_LEN     para[4]             /*數(shù)據(jù)包長(zhǎng)度    */
  10. #define         T_LEN       para[5]             /* 傳輸長(zhǎng)度  */
  11. #define         O_NODE      para[6]             /*原結(jié)點(diǎn)地址*/
  12. #define         D_NODE      para[7]             /*目的結(jié)點(diǎn)描述*/
  13. #define         PKG_CRC     para[8]             /*數(shù)據(jù)包CRC */

  14. typedef struct {                /*協(xié)議頭        */
  15.         u_int   para[PARANUM];
  16.         char    *data;
  17. } T_NetHead;
復(fù)制代碼
9個(gè)整數(shù)共36字節(jié)。轉(zhuǎn)化成BASE64,變成48字節(jié)。因此,我的包頭是固定長(zhǎng)度48字節(jié)。
接收端按固定長(zhǎng)度48先收包頭。
然后根據(jù)T_LEN收數(shù)據(jù)。
  1. int RecvNet(int s,char *buf,int n,int timeout)
  2. {
  3. int bcount,br,ret,num=0;
  4. struct timeval tmout;

  5.         if(!buf) return 0;
  6.         tmout.tv_sec=timeout;
  7.         tmout.tv_usec=0;
  8.         ret=setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&tmout,sizeof(tmout));

  9.         *buf=0;
  10.         if(n<=0) return 0;
  11.         bcount=0;
  12.         br=0;

  13.         num=0;
  14.         while(bcount<n){
  15.                 if((br=read(s,buf,n-bcount))>0){
  16.                         bcount+=br;
  17.                         buf+=br;
  18.                         continue;
  19.                 }
  20.                 if(br<0){
  21.                     if(errno==11) return TIMEOUTERR;
  22.                     ShowLog(1,"%s:br=%d,err=%d,%s",__FUNCTION__,br,errno,strerror(errno));
  23.                     return -1;
  24.                 }
  25.                 if(!br ) {
  26.                         if( ++num>100) break;
  27.                         usleep(5000);
  28.                         continue;
  29.                 } else num=0;
  30.         }
  31.         if(bcount<=0) {
  32.                 ShowLog(1,"%s:bcount=%d,err=%d,%s",__FUNCTION__,bcount,errno,strerror(errno));
  33.                 return -1;
  34.         }
  35.         return bcount;
  36. }
復(fù)制代碼
參數(shù)n就是要收的數(shù)據(jù)。如果讀的不夠數(shù),就不斷的讀,直到夠數(shù)或超時(shí)。
您需要登錄后才可以回帖 登錄 | 注冊(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)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP