2010-11-11 55 views
2

我有C代碼監聽端口,但它正在監聽錯誤的端口。C:套接字綁定在錯誤的端口

這是在.h文件中定義:

#define PHANTASIA_PORT 2101 

插座:

int the_socket, error, on=1; 

    /* create a socket */ 
errno = 0; 
if ((the_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) { 

    sprintf(error_msg, 
     "[0.0.0.0:?] Socket creation failed in Do_init_server_socket: %s\n", 
     strerror(errno)); 

    Do_log_error(error_msg); 
    exit(SOCKET_CREATE_ERROR); 
} 

error = setsockopt(the_socket, SOL_SOCKET, SO_REUSEADDR, 
     (char *) &on, sizeof(on)); 

這是怎麼結合:

/* set up the bind address */ 
bind_address.sin_family = AF_INET; 
bind_address.sin_addr.s_addr = INADDR_ANY; 
bind_address.sin_port = PHANTASIA_PORT; 

    /* bind to that socket */ 
error = bind(the_socket, (struct sockaddr *) &bind_address, 
     sizeof(bind_address)); 
error = listen(the_socket, SOMAXCONN); 

但隨後在運行時, lsof reports:

phantasia 2400  root 4u IPv4 2024436  TCP *:13576 (LISTEN) 

當我在定義改變了端口2100,它代替聽了:

phantasia 2266  root 4u IPv4 2021315  TCP *:13320 (LISTEN) 

這是一些舊代碼,但沒有任何警告或編譯時錯誤。也許有些事情正在我的頭上。我有一個調試日誌,當它綁定,它報告它綁定到端口2101.

回答

6

替換PHANTASIA_PORThtons(PHANTASIA_PORT)

2

指定端口號時使用htons函數。

所以這行:

bind_address.sin_port = PHANTASIA_PORT; 

應該是:

bind_address.sin_port = htons(PHANTASIA_PORT); 

htons是將主機轉換成整數網絡整數,固定字節序(HI-LO/LO-功能如果需要,它們中的HI字節順序)。

+4

這是一個絕對可怕的疣在API中,但它永遠不會消失。 – wnoise 2010-11-11 18:42:30

+2

@wnoise:同意100%。回過頭來,一些白癡決定在內核空間中保存一個'bswap'操作碼,這是值得污染每個用戶空間的應用程序,以便用醜陋的endian依賴項來編寫。 – 2010-11-11 18:46:18

+1

@wnoise @R ..不同意。如果你通過網絡發送東西,你必須知道字節順序,把它從sockaddr_ *用戶中隱藏起來並不會幫助任何人。 (儘管我承認,任何人通過網絡發送一個原始的sockaddr_ *結構體或者任何原始結構體,都應該被踢出去)。 – ninjalj 2010-11-11 19:01:56

相關問題