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

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

Chinaunix

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

[網(wǎng)絡(luò)] 網(wǎng)絡(luò)發(fā)送TCP包有很多重傳包,是怎么回事? [復(fù)制鏈接]

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:48:31平安夜徽章
日期:2015-12-26 00:06:30C
日期:2016-10-25 16:26:25
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-11-21 18:12 |只看該作者 |倒序?yàn)g覽
寫了兩個(gè)網(wǎng)絡(luò)程序,一個(gè)客戶端,一個(gè)服務(wù)器端,客戶端連過(guò)去發(fā)送數(shù)據(jù)包發(fā)現(xiàn)對(duì)方?jīng)]接收,通過(guò)wireshark抓包發(fā)現(xiàn)中間有很多重傳包,如圖:


大家看下問(wèn)題出在哪里,謝謝!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-11-22 10:07 |只看該作者
我最近也要做TCP的文件發(fā)送。
不知LZ可否分享下主要代碼研究下。
個(gè)人覺(jué)得,socket的東西,大家都會(huì)寫也沒(méi)什么難度,基本功能也都能實(shí)現(xiàn)
主要的點(diǎn)是程序的健壯性和對(duì)復(fù)雜網(wǎng)絡(luò)環(huán)境的處理。
感覺(jué)自己的程序還有很多需要改進(jìn)的地方。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-11-22 19:28 |只看該作者
上代碼吧,另外,既然你用wireshark抓的包,為何要把時(shí)間那列給省了,最好是全圖

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-11-22 22:43 |只看該作者
理論上,TCP連接立后,應(yīng)該可以直接發(fā)送數(shù)據(jù)了,但是為什么第4條,192.168.20.120會(huì)再次給192.168.50.157發(fā)送一次syn+ack呢?另外樓主著得看下第五條,看下,是不是checksum錯(cuò)誤還是什么原因?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-11-22 22:48 |只看該作者
感覺(jué)三次握手的最后一個(gè)包對(duì)端沒(méi)有收到,一直再重發(fā)SYN+ACK

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:48:31平安夜徽章
日期:2015-12-26 00:06:30C
日期:2016-10-25 16:26:25
6 [報(bào)告]
發(fā)表于 2012-11-26 18:07 |只看該作者
回復(fù) 4# 耗資喜歡貓

大家?guī)头治鱿,主體代碼如下:

  1. void *network_proc_thread(void *arg)
  2. {
  3.     int listenfd, connfd, sockfd, epfd, nfds, i;
  4.         struct sockaddr_in addr, clientaddr;
  5.     socklen_t clilen = sizeof(struct sockaddr);

  6.         if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  7.                 log_it("sock create failed!: %s\n", strerror(errno));
  8.                 pthread_exit(-1);
  9.         }

  10.     int listen_port = LISTEN_PORT;

  11.         bzero(&addr, sizeof(addr));
  12.         addr.sin_family = AF_INET;
  13.         addr.sin_port = htons(listen_port);
  14.         addr.sin_addr.s_addr = htonl(INADDR_ANY);

  15.         //重用端口
  16.         int opt = 1;
  17.         if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
  18.         log_it("setsockopt REUSEADDR error: %s\n", strerror(errno));
  19.     }
  20.         if (bind(listenfd, (struct sockaddr*)&addr, sizeof(addr))) {
  21.                 log_it("sock bind Failed: %s\n", strerror(errno));
  22.                 pthread_exit(-1);
  23.         }
  24.         if (listen(listenfd, 10)) {
  25.         close(listenfd);
  26.                 log_it("sock listen Failed!\n");
  27.                 pthread_exit(-1);
  28.         }

  29.         log_it("network listening on port: %d ......\n", listen_port);

  30.     //把socket設(shè)置為非阻塞方式
  31.     set_nonblock(listenfd);

  32.     //聲明epoll_event結(jié)構(gòu)體的變量,ev用于注冊(cè)事件,數(shù)組用于回傳要處理的事件
  33.     struct epoll_event ev, events[20];
  34.     //生成用于處理accept的epoll專用的文件描述符
  35.     epfd = epoll_create(256);

  36.     ev.data.fd = listenfd;
  37.     ev.events = EPOLLIN | EPOLLET;
  38.     if (epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev) == -1) {
  39.         perror("epoll_ctl: listenfd");
  40.         exit(1);
  41.     }

  42.     while (1) {
  43.         nfds = epoll_wait(epfd, events, 20, 500);

  44.         for (i = 0; i < nfds; ++i) {
  45.             if(events[i].data.fd == listenfd) {//如果新監(jiān)測(cè)到一個(gè)SOCKET用戶連接到了綁定的SOCKET端口,建立新的連接。
  46.                 connfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clilen);
  47.                 if (connfd < 0){
  48.                     log_it("accept error!\n");
  49.                     continue;
  50.                 }

  51.                 int port;
  52.                 char ip_addr[20] = {0};
  53.                 get_ip_port(connfd, ip_addr, &port);
  54.                 log_it("receive a connection from: %s : %d, fd: %d ......\n", ip_addr, port, connfd);

  55.                 ev.events = EPOLLIN | EPOLLET;
  56.                 ev.data.fd = connfd;
  57.                 epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ev);
  58.             } else if(events[i].events & EPOLLIN) {
  59.                 if ((sockfd = events[i].data.fd) < 0)
  60.                     continue;

  61.                 request_head_t  pkt_head;
  62.                 int n;

  63.                 if ((n = read(sockfd, &pkt_head, sizeof(pkt_head))) < 0) {
  64.                     if (errno == ECONNRESET) {
  65.                         log_it("peer may crash!!\n");
  66.                         close(sockfd);
  67.                         epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL);
  68.                         continue;
  69.                     } else
  70.                         log_it("read request_head_t error: %d\n", errno);
  71.                 } else if (n == 0) {
  72.                     log_it("peer may close the socket!\n");
  73.                     close(sockfd);
  74.                     epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL);
  75.                     continue;
  76.                 }
  77.                                
  78.                                 ......  //處理請(qǐng)求
  79.                                
  80.                 ev.data.fd = sockfd;
  81.                 ev.events = EPOLLOUT | EPOLLET;
  82.                 epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);

  83.             } else if(events[i].events & EPOLLOUT) {
  84.                 sockfd = events[i].data.fd;

  85.                 ev.data.fd = sockfd;
  86.                 ev.events = EPOLLIN | EPOLLET;
  87.                 epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);
  88.             } else if (events[i].events & EPOLLERR) {
  89.                 log_it("fd: %d is bad!\n", events[i].data.fd);
  90.                 close(events[i].data.fd);
  91.                 epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
  92.             } else if (events[i].events & EPOLLHUP) {
  93.                 log_it("fd : %d EPOLLHUP!\n", events[i].data.fd);
  94.             }
  95.         }
  96.     }

  97.     log_it("network thread exit normally!\n");
  98.     return 0;
  99. }
復(fù)制代碼
帶有時(shí)間的抓包截圖:

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:48:31平安夜徽章
日期:2015-12-26 00:06:30C
日期:2016-10-25 16:26:25
7 [報(bào)告]
發(fā)表于 2012-11-26 18:10 |只看該作者
dolphin836 發(fā)表于 2012-11-22 10:07
我最近也要做TCP的文件發(fā)送。
不知LZ可否分享下主要代碼研究下。
個(gè)人覺(jué)得,socket的東西,大家都會(huì)寫也沒(méi) ...

我做的不是文件傳輸,而是一個(gè)自定義協(xié)議通訊的東東,主要代碼見(jiàn)樓上。
關(guān)于網(wǎng)絡(luò)開(kāi)發(fā)這一塊跟你有同感,做穩(wěn)定和容錯(cuò)性好確實(shí)很需要花功夫,也需要一定的技術(shù)沉淀,這也是我的一個(gè)目標(biāo)。

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:48:31平安夜徽章
日期:2015-12-26 00:06:30C
日期:2016-10-25 16:26:25
8 [報(bào)告]
發(fā)表于 2012-11-26 18:14 |只看該作者
耗資喜歡貓 發(fā)表于 2012-11-22 22:43
理論上,TCP連接立后,應(yīng)該可以直接發(fā)送數(shù)據(jù)了,但是為什么第4條,192.168.20.120會(huì)再次給192.168.50.157發(fā) ...

checksum這一塊我看了,是“validation disabled”的。

另外說(shuō)一下,這個(gè)程序剛開(kāi)始跑是沒(méi)問(wèn)題的,跑了大概18天才出現(xiàn)的,這中間發(fā)生了什么我無(wú)從知道。大概還是哪種情況沒(méi)考慮周全。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-11-30 11:02 |只看該作者
tcp協(xié)議保證數(shù)據(jù)收發(fā)。。是不是網(wǎng)絡(luò)不好,導(dǎo)致丟包,然后tcp協(xié)議重傳。

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:48:31平安夜徽章
日期:2015-12-26 00:06:30C
日期:2016-10-25 16:26:25
10 [報(bào)告]
發(fā)表于 2012-11-30 12:27 |只看該作者
回復(fù) 9# zozoiiiiii


    內(nèi)網(wǎng)環(huán)境,也排除了IP、MAC地址沖突可能性,我懷疑是程序哪里沒(méi)寫好。
您需要登錄后才可以回帖 登錄 | 注冊(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ū)
中國(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