2014-03-07 17 views
1

我試圖引進在C.人爲延遲在使用C TCP套接字,對於競爭條件開發

的想法是,它需要一段時間的客戶端連接實現TCP套接字服務器的人爲延遲到目的地的服務器。

爲了實現這一點,我嘗試了,而不是簡單地使用阻塞accept()接收連接,查詢等待的連接,然後在accept()之前輪詢sleep()

但是,看起來好像數據寫入其他緩衝區,唯一的影響是它需要sleep()延遲我的程序從緩衝區中讀取。同時客戶已經愉快地連接併發送了數據。

我對此有何看法?可能相關的信息:客戶端和服務器都通過同一個虛擬機(VMWare Player)上的環回接口連接。

我的客戶端代碼:

printf("Connecting to %s:18211 .. ", host); fflush(stdout); 

fd = socket(AF_INET, SOCK_STREAM, 0); 

memset(&sin, 0, sizeof(struct sockaddr_in)); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = inet_addr(host); 
sin.sin_port = htons(18211); 

if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -1) { 
    printf("Unable to connect to host %s\n", host); 
    exit(EXIT_FAILURE); 
} 

#define HITHERE ".oO Oo.\n" 
if(write(fd, HITHERE, strlen(HITHERE)) == -1) { 
    printf("Unable to write banner to host %s\n", host); 
    exit(EXIT_FAILURE); 
} 
#undef HITHERE 

printf("Connected!\nSending file .. "); fflush(stdout); 

ffd = open(file, O_RDONLY); 
if(ffd == -1) { 
    printf("Damn. Unable to open file\n"); 
    exit(EXIT_FAILURE); 
} 

Server代碼:

我試圖做一個插座poll()然後accept()這裏睡前,但同時數據接收有客戶端沒有延遲。

+0

我看不到任何服務器代碼。複製並粘貼錯誤? – thuovila

+0

@thuovila我把它保存在一個從Live CD啓動的掛起的虛擬機中,但它沒有恢復,所以我失去了它! – deed02392

回答

4

在OS層收到通知之前,TCP握手(SYN,SYN/ACK,ACK)發生,客戶端可以立即自由發送數據。 accept()只是一個服務器端的東西,爲你提供了一個特定連接的fd。

如果你想延遲建立連接,你應該在你的防火牆中做。

1

我第二個防火牆的想法,例如iptables中的ACK有些延遲。另一件嘗試可能是將listen() backlog設置爲0或者非常小的東西。然而,IIRC(雖然我不確定)Linux不會將它設置爲你給listen()的數字,所以你必須試驗看看它有多大。在致電accept()之前查看有多少客戶端連接,然後再添加一個以「被利用」。