我正在寫一個UDP客戶端,我需要在我的數據中提及我的UDP數據包的源端口來發送。C中的UDP客戶端源端口?
- 我的程序如何獲取由udp客戶端用來發送數據到voip服務器的kernal生成的隨機端口號。 so
- 如何在發送數據前指定特定的UDP源端口。
我會非常非常感激。請儘快回覆我。我的項目在此時停止。
我正在寫一個UDP客戶端,我需要在我的數據中提及我的UDP數據包的源端口來發送。C中的UDP客戶端源端口?
我會非常非常感激。請儘快回覆我。我的項目在此時停止。
您應該將bind(2)
的插口輸入您選擇的其他端口。另見 man 7 ip
和man 7 udp
。
使用bind
將您的套接字綁定到端口0,這將允許您使用getsockname
來獲取端口。如果您願意,您還可以將套接字綁定到特定的端口。
如(假設IPv4套接字,沒有錯誤檢查):
struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = 0;
bind(sock, (struct sockaddr *)&sin, sizeof(sin));
/* Now bound, get the address */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);
另外,如果你是一個單一的服務器進行通信,您可以在UDP套接字使用connect
(這也爲您提供了得心應手的副作用允許您使用send
而不是sendto
,並且使UDP套接字只接受來自「連接」對等體的數據報),然後使用getsockname
獲取您的本地端口/地址。在使用connect
之前,您仍然可以選擇綁定您的套接字。
如:
struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
/* set sin to your target host... */
...
connect(sock, (struct sockaddr *)&sin, sizeof(sin));
/* now retrieve the address as before */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);
我無法解決問題,你可以打一些代碼段。 – shan
Didnt工作...你吉美一些代碼。 – shan
首先顯示非工作代碼,並解釋它不工作的方式(錯誤代碼,意外行爲...)。 –