無法 listen port?
發表於 : 10/28/2004 11:32 pm
我為了測試網路通訊協定,寫了一個 listen TCP port 的程式,動作很簡單,就只是把接收到的東西印在螢幕上。雖說是寫,其實是從 Wrox 那本 Programming Linux 抄下來的,code 如下:
放在 OS X 上用 gcc 編譯、執行都無問題,但是 client 端卻一直無法建立連線。我到 Share 下檢查過防火牆設定,沒有開啟。檢查過網路,可以排除所有 IP 設定錯誤、網路連線不通等等雜七雜八的失誤。後來我把整段程式搬到 Linux 機器上,編譯執行,用同一個 client 端連,卻可以成功建立連線。
請問為什麼會這樣呢?我確定 OS X 可以用 Socket 的方式建立網路連線,我使用同樣來源的 Client 端程式在 Mac 上跑,連到 Linux Server,就可以動作。難道 OS X 的 Socket Listen 都要經過系統 API 登記之後才允許開放?
搞不懂...
代碼: 選擇全部
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define SERVER_IP "192.168.1.200"
#define SERVER_PORT 9876
int main(void) {
int bytes;
int server_fd, client_fd;
int server_len, client_len;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[255];
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(server_fd<0) {
perror("Can not create Socket");
_exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_aton(SERVER_IP,&server_addr.sin_addr);
bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_fd, 5);
while(1) {
printf("server ready\n");
client_len = sizeof(client_addr);
client_fd = accept(server_fd,
(struct sockaddr *)&client_addr, &client_len);
while((bytes=read(client_fd, buffer, 255))>0) {
buffer[bytes]=(char)NULL;
printf(buffer);
}
close(client_fd);
}
_exit(0);
}請問為什麼會這樣呢?我確定 OS X 可以用 Socket 的方式建立網路連線,我使用同樣來源的 Client 端程式在 Mac 上跑,連到 Linux Server,就可以動作。難道 OS X 的 Socket Listen 都要經過系統 API 登記之後才允許開放?
搞不懂...