簡體   English   中英

在簡單的python程序中,我丟失了udp數據包

[英]In the simple python program I lost udp packets

作業系統: Windows 8

適用於python工具鏈的IDE Eclise Juno + Aptana插件

語言 Python 3.3

我嘗試從一台計算機向另一台計算機發送兩個udp數據包。 這是源代碼

from socket import *
import time

port=5000
ip_addr='192.168.4.122'
my_ip='192.168.4.6'

sock = socket(AF_INET,SOCK_DGRAM)
sock.bind((my_ip,port))

data=bytes([0xc9,0x01,0,0,0xc8,port & 0x00ff,(port >> 8) & 0x00ff,0,1,1,0,1,0,ord('F'),ord('P')])
sock.sendto(data,(ip_addr,port))
data=bytes([0xc9,0x01,0,0,0xc8,port & 0x00ff,(port >> 8) & 0x00ff,0,1,1,0,1,0,ord('k'),ord('f'),ord('?')])
sock.sendto(data,(ip_addr,port))

time.sleep(3)

print("end of the programm");

但是,如果我在兩台計算機上都運行wireshark,則只會看到第一個數據包。 我在哪里丟了第二個小包??? 我做錯了什么? 在我的交換機中,僅連接了兩台計算機。 我添加了sendto調用結果的輸出。 這些結果是肯定的。

嘗試使用socket.send而不是socket.sendto。 除此之外,UDP是一種“發送並忘記”協議。 如果要確定數據是否到達,則需要使用TCP。

@Ayy如果我在“ sendto”之間添加time.sleep(1),則所有數據包均已成功發送。

特別針對@ayy,我繼續調查。 我用C語言編寫此程序。

   int main(void) {
        struct sockaddr_in udp_addr;
        struct sockaddr_in remote_addr;
        int on=1;
        int snd_rcv_buf = 131072;
        int sock_fd;
        socklen_t udp_addr_len;

        char data[] = { 0xc9,0x01,0,0,0xc8,0x88,0x13,0,1,1,0,1,0,0x46,0x50 };
        char data1[] = { 0xc9,0x01,0,0,0xc8,0x88,0x13,0,1,1,0,1,0,0x6b,0x66,0x3f };

        sock_fd = socket(PF_INET, SOCK_DGRAM, 0);

        setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
        setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
        setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &snd_rcv_buf, sizeof(snd_rcv_buf));
        setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &snd_rcv_buf, sizeof(snd_rcv_buf));

        memset(&udp_addr, 0, sizeof(udp_addr));
        udp_addr.sin_family = AF_INET;
        udp_addr.sin_port = htons(5000);
        udp_addr_len = sizeof(udp_addr);

        if (inet_aton("192.168.4.66", &udp_addr.sin_addr) == 0)
        {
            printf( (char *)"Address translate error\n");
            return -1;
        }

        if (bind(sock_fd, (struct sockaddr*)&udp_addr, udp_addr_len)!=0)
        {
            printf((char *)"Error bind udp-socket\n");
            return -1;
        }

        memset(&remote_addr, 0, sizeof(remote_addr));
        remote_addr.sin_family = AF_INET;
        if (inet_aton("192.168.4.122", &remote_addr.sin_addr)==0)
            printf((char *)"remote address translate error");
        remote_addr.sin_port = htons(5000);


        int res = sendto(sock_fd, data, /*len*/15, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
        printf("%d ",res);
        res = sendto(sock_fd, data1, /*len*/16, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
        printf("%d ",res);

        puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
        return EXIT_SUCCESS;
}

和情況已經重復。 但是.........注意!!!!!!! 如果我在RedHat 6.5虛擬機(主機是Windows 8)中調用此代碼,則所有數據包均已成功發送。 喔喔喔喔 一切正常。 事實證明,在Windows 8操作系統中存在該問題。

我在本地嘗試了您的代碼

[root @ localhost#]#tcpdump -i lo src 127.1.1.1 tcpdump:禁止詳細輸出,請使用-v或-vv在lo上偵聽完整協議解碼,鏈接類型為EN10MB(以太網),捕獲大小為65535字節19:32 :10.905035 IP 127.1.1.1.commplex-main> 127.1.1.1.commplex-main:UDP,長度54 19:32:10.905069 IP 127.1.1.1.commplex-main> 127.1.1.1.commplex-main:UDP,長度60

@HSEM請參閱此代碼節選。

int res = sendto(sock_fd, data, /*len*/15, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
printf("%d ",res);
res = sendto(sock_fd, data1, /*len*/16, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
printf("%d ",res);

如果我評論printf然后。

   int res = sendto(sock_fd, data, /*len*/15, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
//    printf("%d ",res);
    res = sendto(sock_fd, data1, /*len*/16, 0, (struct sockaddr*)&remote_addr, udp_addr_len);
//    printf("%d ",res);

我開始丟包了 事實證明,“發送”呼叫之間存在延遲問題。 如果存在,那么一切都將完美運行。 如果沒有延遲,那么我開始丟失數據包。 類似的情況在python代碼https://stackoverflow.com/a/31889368/1936079中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM