1. 程式人生 > >一個有趣的實驗---tcp傳送緩衝區滿, 然後殺掉程序(處於FIN_WAIT1狀態), 接收端是無感知的。

一個有趣的實驗---tcp傳送緩衝區滿, 然後殺掉程序(處於FIN_WAIT1狀態), 接收端是無感知的。

       服務端程式:

#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[50001] = {0};  
		int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf) - 1, 0);  
		printf("iRet is %d\n", iRet);	
	}  
	
	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阻塞, ctrl c殺死程序, 此時客戶端socket處於FIN_WAIT1狀態。 客戶端tcpdump抓包看不到FIN包和RST包, 而且服務端的socket也依然是ESTABLISHED的狀態。

       這個問題非常有意思, 其實客戶端是發了FIN包的, 至於為什麼tcpdump抓不到包, 且服務端socket狀態沒有變化(無感知), 大家可以思考一下。

相關推薦

一個有趣實驗---tcp傳送緩衝區滿 然後殺掉程序(處於FIN_WAIT1狀態) 接收感知

       服務端程式: #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <

程式中建立一個子程序然後父子程序各自獨自執行程序在標準輸入裝置上讀入小寫字母寫入管道程序從管道讀取字元並轉化為大寫字母讀到x結束

程式中建立一個子程序,然後父子程序各自獨自執行,父程序在標準輸入裝置上讀入小寫字母,寫入管道。子程序從管道讀取字元並轉化為大寫字母。讀到x結束。(非字母字元就輸出本身) 相關的系統函式:fork(),read(),write(),pipe(); 筆者在telnet上寫這些程式碼,由於

TCP傳送緩衝區

每一個TCP套接字都有一個傳送緩衝區,可以使用SO_SNDBUF套接字選項來更改緩衝區的大小。當某個程序呼叫write時,核心從該應用程序的緩衝區複製所有資料到套接字的傳送緩衝區中,如果該套接字的傳送緩衝區容不下該應用程序的所有資料(或是應用程序的緩衝區大於套接

別人給我一個介面是個url地址讓我推送資料過去然後得到別人返回的資料怎麼呼叫這個介面呢?

1:客戶端地址:http://1*2.***.**.1*4:7**8/peasentProducts/save(需要把服務端資料傳送到客戶端) 2:自己在控制層把資料放在放在一個map集合中,自己寫一個類封裝一個方法,把資料傳送過去   3:controller---控制層程式

程式設計輸入一個10進位制正整數然後輸出它所對應的八進位制數

方法一 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); whil

程序fork()兩次---解決一個程序不必等待子程序終止也不希望子程序處於僵死狀態(一般是伺服器程序fork())

首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork()就是為了解決這些相關的問題而出現的一種程式設計方法。  孤兒程序         孤兒程序是指父程序在子程序結束之前死亡(return 或exit)。如下圖1所示:

獲取數值型數組的最大值和最小值使用遍歷獲取每一個然後記錄最大值和最小值的方式(數組遍歷嵌套if判斷語句)

if判斷 增強 ++ pre sta 方法 最小值 test 記錄 package com.Summer_0420.cn; /** * @author Summer * .獲取數值型數組的最大值、最小值 * 方法:遍歷獲取每一個值,記錄最大值; *

原!tomcat啟動超時(打印了幾行日誌後面沒了也不報錯處於啟動狀態直到超時)

str tro 啟動項 dao 配置 spa 配置文件 size 結果 項目框架:spring+struts2+mybatis 今天優化代碼,改了一堆mybatis dao和xml文件,啟動項目時,就出現如標題描述的狀況:打印了幾行日誌,後面就不打印了,也不報錯,處於啟動狀

kubernetes創建yamlpod服務一直處於 ContainerCreating狀態的原因查找與解決

because str first 拉取 name 麻煩 ole details efault 最近剛剛入手研究kubernetes,運行容器的時候,發現一直處於ContainerCreating狀態,悲了個催,剛入手就遇到了點麻煩,下面來講講如何查

流程一直處於Running狀態應該怎麽停止?

過程 什麽 其中 進程 流程實例 from 構建 啟動 upd 流程一直處於Running狀態,應該怎麽停止? 概述 我們有遇到這種情況:可能由於某些原因,流程發起後一直處於Running狀態,然後我們想Stop掉這些出問題的流程,這個時候你在Workspace裏面進行操作

Qt---去掉標題欄後最大化應用程序窗口時窗口遮住了任務欄的問題

cat bsp zed 任務欄 available des 問題 ica try 不應該使用: this->showFullScreen(); 或 this->showMaximized(); 而應該使用: this->setGeometry(

kubernetes建立yamlpod服務一直處於 ContainerCreating狀態

#   wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm # rpm2cpio python-

visual studio 2017 installer 安裝包製作過程出現的問題---此安裝程式需要.NET Framework 版本 3.5請安裝該版本然後重新執行此安裝程式可以從Web獲得

visual studio 2017 installer 安裝包製作過程出現的問題---此安裝程式需要.NET Framework 版本 3.5,請安裝該版本,然後重新執行此安裝程式,可以從Web獲得.NET Framework 。要立即做此事嗎?     &nbs

java程式設計師工作3年每天坐吃等死狀態該如何打破這種情況?

今天我們來聊一聊程式設計師枯燥的程式設計生活和每天坐吃等死的狀態,相對於其他行業來說,程式設計這件事肯定是枯燥的,即使是對程式設計非常有興趣的同學和朋友也會如此,我為什麼這麼說呢?大家可以不看下文,在這裡停頓思考一下。 實事求是的說,作為一個開發者,一個程式設計師,我相信大

我在匯入我們老師寫的程式碼時他是用的學生機是win7系統然後我匯入到eclipse時發現專案裡面中文都變成了問號形式的亂碼

我在匯入我們老師寫的程式碼時,他是用的學生機,是win7系統,然後我匯入到eclipse時,發現專案裡面中文都變成了問號形式的亂碼。 我按照別人的指引修改把工作空間的編碼格式改為UTF-8,還有Java檔案也改成了UTF-8,然後還是沒有成功,最後得到老師指引,他說要跟單獨檔案修改resource改

程序結束其子程序不會結束會掛到init程序下 孤兒程序與殭屍程序[總結]

結論:一個父程序產生子程序,父程序結束(kill),子程序不會結束,子程序被init程序託管 下面是過程:     d.sh指令碼是一個ping命令,執行d.sh             &nb

spark streaming應用提交到yarn上一直處於ACCEPTED狀態也未報錯

原因已經找到,這裡做個記錄,防止下次再犯類似的錯誤。實際上是因為程式碼中將執行模式設定為本地模式,在提交到yarn上後driver端的程式碼正常執行,並且也正常運行了很多批次。但由於是本地模式,所以driver不會向resourcemanager申請資源,所以也就不會向rm註

一 spark on yarn cluster模式提交作業一直處於ACCEPTED狀態改了Client模式後就正常了

1. 提交spark作業到yarn,採用client模式的時候作業可以執行,但是採用cluster模式的時候作業會一直初一accept狀態。 背景:這個測試環境的資源比較小,提交作業後一直處於accept狀態,所以把作業的配置也設定的小。 submit 語句: spark

java--ArrayList泛型:使用ArrayList泛型新增5個學生物件 然後遍歷列印5位學生的自我介紹方法

import java.util.ArrayList; import java.util.List; /** * 使用ArrayList泛型新增5個學生物件,然後遍歷列印5位學生的自我介紹方法。 * (需建立學生類)Student.java包含 name,age,gen