我認爲你是混亂的「信息」和「dest_addr」。
讓我們來看看原型擴展形式的sendto:
ssize_t sendto (int sockfd,
const void *buf,
size_t length,
int flags,
const struct sockaddr *dest_addr,
socklen_t addrlen);
的sockfd - 這是您提供呼叫建立與socket插座()
BUF - 這是一個指向數組的指針OF BYTES(即他們可以製作char *類型的buf)。也就是說,這是您希望通過封裝在UDP數據包中的線路發送的數據。
長度 - 這是該數組中有多少個字節。如果你沒有通過「長度」,它不知道「buf」是1字節還是10000字節。
標誌 - 通常是0。這是先進的東西
dest_addr - 這是一個指針到目的地址。通常,您初始化一個sockaddr_in實例並將其指針值轉換爲sockaddr *類型。
addrlen - dest_addr的大小。通常是sizeof(sockaddr_in)。地址長度是可變的,因爲dest_addr可能指向IPV4地址(sockaddr_in類型)或IPV6地址(sockaddr_in6類型)或某種其他類型。
從本地端口9999向其端口8888上的遠程主機「1.2.3.4」發送數據包的示例。爲簡潔起見,省略了返回碼的錯誤檢查。
int s;
sockaddr_in addrDest;
sockaddr_in addrLocal;
char* msg = "Hello World";
// create the socket
s = socket(AF_INET, SOCK_DGRAM, 0); // UDP socket
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(9999);
addrLocal.sin_addr = INADDR_ANY; // zero-init sin_addr to tell it to use all available adapters on the local host
// associate this socket with local UDP port 9999
result = bind(s, (struct sockaddr*)&addrLocal, 0);
// send "Hello world" from local port 9999 to the host at 1.2.3.4 on its port 8888
addrDest.sin_family = AF_INET;
addrDest.sin_port = htons(8888);
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4");
// strlen(msg)+1 for terminating null char
result = sendto(s, msg, strlen(msg)+1, 0, (struct sockaddr*)&addrDest, sizeof(addrDest));
是的,我很抱歉的問題的部分狀態。我正在使用原始套接字發送ICMP消息。很明顯,你對套接字非常熟悉。你能告訴我,「dest_addr」是否在行scket中是無效的嗎? – Akr
@Akr:原始插座,呃?那麼,從'man 7 raw':「發送到原始套接字應該採用來自sin_port的IP協議;這種能力在Linux 2.2中丟失了。解決方法是使用IP_HDRINCL」。所以我的猜測是'dest_ *'參數大多被忽略了,你最好用'send'而不是'sendto'。 – rodrigo