2014-09-03 143 views
0

我正在使用標準方式(在許多示例中顯示)在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中的)。但是,有沒有辦法告訴套接字根本不聽進來的數據包?

感謝

回答

1

現在,如果我運行「netstat的-na」,我可以識別系統似乎插座的本地端口上偵聽

UDP套接字有一個內核緩衝區收到消息。無論您是否從用戶空間代碼調用recv/recvfrom/recvmsg,此緩衝區都由內核維護。

1

您可以使用shutdown()how參數設置爲SHUT_RD禁用讀取插座上,可能有停止聽,甚至釋放的接收緩衝區內核的預期行爲。但是接收端口必須保持爲套接字的生命週期分配,因爲它用作與sendto()一起發送的傳出數據包的源端口。你無法避免這種情況。

+0

謝謝,雖然shutdown()沒有幫助。我認爲它可能只對TCP套接字有影響。 – Nadav 2014-09-03 21:37:26

0

它不僅在該端口上「偵聽」,而且還在上通過該端口發送。端口分配是必需的。只要調用sendto(),套接字就會綁定到端口,除非它已經綁定。