我正在使用標準方式(在許多示例中顯示)在C++中創建一個UDP套接字,使其保持活動狀態並不斷髮送信息。在沒有套接字監聽的情況下創建UDP客戶套接字
我只打電話sendto
。我從來沒有打電話給recvfrom
。在此代碼片段中,我只用一次sendto
,然後睡5秒:
C代碼:
static int do_the_rest(int sock)
{
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr=inet_addr("192.168.32.32");
server_addr.sin_port=htons(32000);
char sendline[100];
bzero(sendline,sizeof(sendline));
const struct sockaddr * addr = (const struct sockaddr*)&server_addr;
sendto(sock,sendline,sizeof(sendline),0,addr,sizeof(server_addr));
sleep(5);
return 0;
}
int main(int argc, char**argv)
{
int sock;
sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0) {
perror("socket");
return 1;
}
int ret = do_the_rest(sock);
close(sock);
return ret;
}
現在,如果我運行「netstat的-na」,我可以識別系統似乎聽插座(我刪除我的程序打印本地端口的線,爲清楚起見)的本地端口:
的netstat -na:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
...
udp 0 304 0.0.0.0:53735 0.0.0.0:*
當我試圖在Java中類似的東西,我也似乎得到一些聽力,雖然看起來有點不同(或許IPv6的?):
Java代碼:
import java.io.*;
import java.net.*;
class Udp {
public static void main(String[] args) throws Throwable {
DatagramSocket sock = new DatagramSocket(null);
try {
InetAddress ipAddress = InetAddress.getByName("192.168.32.32");
byte[] sendData = new byte[50000];
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, ipAddress, 32000);
sock.send(sendPacket);
Thread.sleep(5000);
} finally {
sock.close();
}
}
}
的netstat -na:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
...
udp 0 0 :::37053 :::*
我明白這是爲了支持做了可能recvfrom
(0 Java中的)。但是,有沒有辦法告訴套接字根本不聽進來的數據包?
感謝
謝謝,雖然shutdown()沒有幫助。我認爲它可能只對TCP套接字有影響。 – Nadav 2014-09-03 21:37:26