![](/img/trans.png)
[英]Creating a client and server program with python for sending TCP and UDP packets
[英]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.