2012-07-22 91 views
0

我有一個使用兩臺筆記本電腦的實驗裝置,一臺充當發射器,另一臺充當接收器。發送器根據已配置的不同定時器的時間段連續發送不同大小的數據包。接收器捕獲這些數據包並在程序結束時計算PRR。TCP/IP的正常數據包接收比率

發射器和接收器通過約6-7只腳

分開一定距離是正常的0.87分組接收比率此TCP/IP建立或者是它的下側?

變送器:

void sendMedicalStream(void) { 

    timer_count ++; 

    if(timer_count % 5 ==0) {   

    memcpy(pu8 ,(struct pulse_oxim_packet*)& oxim_packet , sizeof(struct 
       pulse_oxim_packet)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 50 == 0) {  
    memcpy(pu8 ,(struct ecg_data*)& wifi_ecg_data , sizeof(struct ecg_data)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 10 == 0) { 
    memcpy(pu8 ,(struct resp_monitor_packet*)& rsp_mon_packet , sizeof(struct 
                   resp_monitor_packet)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 120 == 0) { 
    memcpy(pu8 ,(struct self_check_glucose_monitor_packet*)& gm_packet , sizeof(struct 
          self_check_glucose_monitor_packet)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 30 == 0) { 
    memcpy(pu8 ,(struct self_check_weight_monitor*)& wm_packet , sizeof(struct 
                self_check_weight_monitor)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 25 == 0) { 
    memcpy(pu8 ,(struct asthma_monitor*)& as_mon_packet , sizeof(struct asthma_monitor)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

    if(timer_count % 35 == 0) { 
    memcpy(pu8 ,(struct sc_blood_press_mon_packet*)& bp_mon_packet , sizeof(struct 
         sc_blood_press_mon_packet)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 

if(timer_count % 45 == 0) { 
    memcpy(pu8 ,(struct insulin_pump_packet*)& ins_pump_packet , sizeof(struct 
         insulin_pump_packet)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 


    if(timer_count % 15 == 0) { 
    memcpy(pu8 ,(struct fetal_heart_monitor *)& fhm_packet , sizeof(struct 
          fetal_heart_monitor)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 
    } 
    if(timer_count % 180 == 0) { 
    memcpy(pu8 ,(struct dialysis_machine *)& dial_mach_packet , sizeof(struct 
         dialysis_machine)); 
    x=send(s,pu8,sizeof(u8aSendBuffer),0); 

    } 

    if(timer_count == 10000) 
    timer_count = 0; 
    } 

int main(int argc,char **argv) 
    { 

struct sockaddr_in sin; 

/* Packet Title DEtails */ 
    strcpy(fhm_packet.title,"Fetal-Heart-Rate-Monitor"); 
    strcpy(bp_mon_packet.title,"Blood-Pressure-Monitor"); 
    strcpy(ins_pump_packet.title,"Insulin-Pump-Monitor"); 
    strcpy(wm_packet.title,"Weight-Monitor"); 
    strcpy(as_mon_packet.title,"Asthma-Monitor"); 
    strcpy(gm_packet.title,"Glucose-Level-Monitor"); 
    strcpy(rsp_mon_packet.title,"Infant-Respiratory-Monitor"); 
    strcpy(dial_mach_packet.title,"Dialysis-Machine"); 


    /* Socket Details */ 
    len=sizeof(struct sockaddr); 

    if(argc==2){ 
    host =argv[1]; 
    } 

    /* translates the host name into peer's IP address */ 

    hp=gethostbyname(host); 
    if(!hp){ 
    fprintf(stderr,"duplex-talk : uknown host : %s\n",host); 
    exit(1); 
    } 

    /* build address data structures */ 

    bzero((char *)&sin, sizeof(sin)); 
    sin.sin_family = AF_INET; 
    bcopy(hp->h_addr,(char *)(&sin.sin_addr),hp->h_length); 
    sin.sin_port = htons(SERVER_PORT); 

    /* active open */ 
    if((s = socket(PF_INET,SOCK_STREAM,0))<0) { 
    perror("duplex-talk : socket"); 
    exit(1); 
    } 

    if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) <0) { 
    perror("duplex-talk : connect"); 
    exit(1); 
    } 


    /* Timer Details */ 

    struct itimerval it_val; /* for setting itimer */ 

    if (signal(SIGALRM, (void (*)(int)) sendMedicalStream) == SIG_ERR) { 
    perror("Unable to catch SIGALRM"); 
    exit(1); 
    } 


    it_val.it_value.tv_sec =  MIN_INTERVAL/1000; 
    it_val.it_value.tv_usec = (MIN_INTERVAL*1000) % 1000000; 
    it_val.it_interval = it_val.it_value; 

    if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) { 
    perror("error calling ECG setitimer()"); 
    exit(1); 
    } 


/* main loop : get and send lines of text */ 
    int i=0,j=0; 
while(1); 

} 

接收機:

int main(int argc,char *argv) 
    { 
    char * pu8 = u8aSendBuffer; 
    signal(SIGINT,INThandler); 
struct sockaddr_in sin; 
struct sockaddr addr; 
socklen_t fromlen; 
char buf[MAX_LINE]; 


len=sizeof(struct sockaddr); 

/* build address data structues */ 

bzero((char *)&sin, sizeof(sin)); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = INADDR_ANY; 
sin.sin_port = htons(SERVER_PORT); 

/* setup passive open*/ 

if((s=socket(PF_INET,SOCK_STREAM,0))<0) { 
     perror("duplex-talk:socket"); 
     exit(1); 
    } 

    if((bind(s,(struct sockaddr *)&sin, sizeof(sin))) < 0){ 

    perror("duplex-talk: bind"); 
    exit(1); 
    } 

    // listen 
    listen(s,MAX_PENDING); 

    if((new_s = accept(s,(struct sockaddr *)&sin, &len)) < 0) { 
    perror("duplex-talk : accept"); 
    exit(1); 
    } 

    while(1) 
    { 


    recv(new_s,pu8,sizeof(u8aSendBuffer),0); 

    p_ptr = (struct pulse_oxim_packet *)pu8; 
    ecg_ptr = (struct ecg_data *)pu8; 
    resp_mon_ptr = (struct resp_monitor_packet *)pu8; 
    gmon_ptr = (struct self_check_glucose_monitor_packet *)pu8; 
    wmon_ptr = (struct self_check_weight_monitor *)pu8; 
    asmon_ptr = (struct asthma_monitor *)pu8; 
    bp_mon_ptr = (struct sc_blood_press_mon_packet *)pu8; 
    ins_pump_packet = (struct insulin_pump_packet *)pu8; 
    ft_mon_ptr = (struct fetal_heart_monitor *) pu8; 
    dial_mach_ptr = (struct dialysis_machine *) pu8;  



    if(p_ptr != NULL && strcmp(p_ptr->title,"Pulse-Oximeter-Data") == 0) 
    recv_count++; 
    if(ecg_ptr != NULL && strcmp(ecg_ptr->title,"ECG-Monitor-Data") == 0) 
    recv_count++; 
    if(gmon_ptr != NULL && strcmp(gmon_ptr->title,"Glucose-Level-Monitor") == 0) 
    recv_count++; 
    if(asmon_ptr != NULL && strcmp(asmon_ptr->title,"Asthma-Monitor") == 0) 
    recv_count++; 
    if(wmon_ptr != NULL && strcmp(wmon_ptr->title,"Weight-Monitor") == 0) 
    recv_count++; 
    if(ins_pump_packet != NULL && strcmp(ins_pump_packet->title,"Insulin-Pump-Monitor") 
          == 0) 
    recv_count++; 
    if(bp_mon_ptr != NULL && strcmp(bp_mon_ptr->title,"Blood-Pressure-Monitor") == 0) 
    recv_count++; 
    if(ft_mon_ptr != NULL && strcmp(ft_mon_ptr->title,"Fetal-Heart-Rate-Monitor") == 0) 
    recv_count++; 
    if(dial_mach_ptr != NULL && strcmp(dial_mach_ptr->title,"Dialysis-Machine") == 0) 
    recv_count++; 
    } 

    return 0; 
    } 
+0

你使用的是TCP還是UDP?我懷疑是UDP,因爲使用TCP時,TCP不會丟失任何數據包,因爲TCP會重傳任何丟失的數據包。當你提到電腦之間的距離時,你是否也使用無線? – HeatfanJohn 2012-07-22 20:07:05

+0

我正在使用TCP套接字..和Wifi是通信媒體.. – hektor 2012-07-22 20:10:14

+1

@hektor:那麼你究竟如何衡量這種損失?它是需要重發的次數,還是你真的失去了*數據*? – 2012-07-22 20:17:56

回答

1

我不是一個網絡專家,但如果你的變送器是不斷傳輸的數據包,它很可能採取與ACK遠遠干擾數據包比通常情況下。

我的猜測是,如果你修改它非常輕微,使它不會飽和連接,你會發現你有更高的數據包接收率。

編輯:在看到你的代碼,我相信一個可能的問題是,即使你創建基於流的插座,你不治療它作爲一個 - 你假定你」會得到每個recv電話只有一個包:

recv(new_s,pu8,sizeof(u8aSendBuffer),0); 

您應該使用從recv的返回值,看看有多少字節實際上被接收。

這是可能你是半行不行忽視它在這種情況下,由於具有非常小的接收窗口(我不知道是什麼sizeof(u8aSendBuffer)),但通常你應該被處理流就像你一樣的數據包序列:你應該把它當作一個數據流,你可能會或可能不會收到你要求的數據。