什麼情況下,傳送端的send函式成功, 但傳送端抓不到對應的網路包?------深入理解send函式
什麼情況狂下,傳送端的send函式成功, 但傳送端抓不到對應的網路包? 這是一個很有趣的問題。
我們看下服務端程式:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
int main()
{
int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.s_addr = INADDR_ANY;
addrSrv.sin_port = htons(8765);
bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
listen(sockSrv, 5);
struct sockaddr_in addrClient;
int len = sizeof(struct sockaddr_in);
int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, (socklen_t*)&len);
while(1)
{
getchar();
char szRecvBuf[1001] = {0};
int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf) - 1, 0);
printf("iRet is %d\n", iRet);
}
getchar();
close(sockConn);
close(sockSrv);
return 0;
}
再看客戶端程式:
#include <unistd.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
int main()
{
int sockClient = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.s_addr = inet_addr("10.100.70.140");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8765);
connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
#define N 2000
char szSendBuf[N] = {0};
for(unsigned int i = 0; i < N; i++) //×Ö·ûÊý×é×îºóÒ»¸ö×Ö·û²»ÒªÇóÊÇ¡®\0¡¯
{
szSendBuf[i] = 'a';
}
int total = 0;
while(1)
{
int iRet = send(sockClient, szSendBuf, sizeof(szSendBuf) , 0);
total += iRet;
printf("iRet is %d, total send is %d\n", iRet, total);
getchar();
}
close(sockClient);
return 0;
}
啟動服務端, 再啟動客戶端, 讓服務端一直髮發發, 發發發, 服務端不recv, 那麼過不了多久, 服務端的核心緩衝區就會滿了, 繼續發的話, 資料就會在客戶端的核心緩衝區中不斷堆積, 此時send函式還是會成功的(因為客戶端的傳送緩衝區沒有滿), 但是, 此時tcpdump是抓不到包的? 為什麼, 因為根本麼有傳送資料在網路卡上流動。
這裡, 我們要再次說說send函式, send函式並沒有傳送資料的能力, send函式的作用僅僅是把應用程式的資料拷貝到傳送端的核心緩衝區中, 只要有足夠的空間, send函式就不會阻塞, 就會返回成功。 至於核心緩衝區中的資料是否傳送, 什麼時候傳送, 那是協議棧的事情, 跟send函式沒有半毛錢的關係。
所以, send函式應該改名為copy_date_from_user_space_2_kerner_space.
好的, 不多說。 有興趣的朋友, 可以親自試下上述實驗。
相關文章
- 利用MessageConnection的send函式時,如何不顯示簡訊傳送確認框?函式
- 常用Email元件傳送函式 (轉)AI元件函式
- Socket send函式和recv函式詳解函式
- flutter: 深入通訊-傳送端Flutter
- 深入理解箭頭函式和傳統函式的區別函式
- QT之靜態函式傳送訊號QT函式
- QT槽函式獲取訊號傳送物件QT函式物件
- C語言kill()函式:傳送訊號給指定的程式C語言函式
- 閉包函式(匿名函式)的理解函式
- 深入理解python函式傳參機制Python函式
- facebook web端傳送應用通知邀請Web
- 【Azure Service Bus】 Service Bus如何確保訊息傳送成功,傳送端是否有Ack機制
- C語言alarm()函式:設定訊號傳送鬧鐘C語言函式
- wireshark抓包curl傳送http2請求HTTP
- 傳遞函式函式
- 深入理解 函式、匿名函式、自執行匿名函式函式
- 資料包遠端傳輸的抓包系統scratch
- 在沒有curl和wget情況下傳送HTTP請求wgetHTTP
- 函式的引數傳遞函式
- 深入理解 JavaScript 中的函式JavaScript函式
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- 使用Java客戶端傳送訊息和消費的應用Java客戶端
- 利用SqlServer系統儲存過程sp_send_dbmail傳送郵件例項(二)SQLServer儲存過程AI
- 利用MSMQ傳送訊息(物件)到NServiceBus終結點(不採用Send-Only方式)MQ物件
- 深入理解 Generator 函式函式
- swift 函式傳遞Swift函式
- 陣列對換,print函式傳參陣列函式
- 深入理解redux之reducer為什麼是純函式Redux函式
- 深入理解函式節流與函式防抖函式
- 【CRC校驗方法】+【FPGA實現(傳送端)】FPGA
- 分散式事務:訊息可靠傳送分散式
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- 對JavaScript中函式物件的理解JavaScript函式物件
- 後端做了負載均衡的情況下,前端怎麼做分片上傳檔案?後端負載前端
- Jenkins 如何成功傳送郵件?Jenkins
- 成功透過ORACLE傳送郵件Oracle
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- Laravel SMS 簡訊傳送包Laravel