2011-03-09 8 views
0

複数のマシンで動作するソケットサーバーがあります。 マシン以外の魅力のように機能します。acceptがEFAULTで失敗する

サーバーは正しくバインドしますが、クライアントが接続しようとするとエラー(EFAULT)が戻されます。

誰かが、問題の原因が何であるか考えているのかもしれません。ありがとうございます!

マシンに関するいくつかの情報に: Linuxバージョン2.6.18.3 gccのバージョン3.3.5(Debianの1:3.3.5-13)

ソケットサーバのソースは、前方かなりストレートです。

... 
... 
struct sockaddr_in server_addr; 
struct sockaddr* client; 
socklen_t alen; 


sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd == -1) { 
    ... 
} 

server_addr.sin_family = AF_INET; 
server_addr.sin_addr.s_addr = INADDR_ANY; 
server_addr.sin_port = htons(port); 

if(bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0){ 
    ... 
} 

if(listen(sockfd,BACKLOG) == -1){ 
    ... 
} 

alen = sizeof(client); 

new_fd = accept(sockfd, client, &alen); 
if (new_fd == -1) { 
     /* 
     * this part of the code is executed 
     * errno is set to 14 
     */ 
} 

私に正しい方向を指摘していただきありがとうございます。

答えて

3

使用すると、この:。

struct sockaddr_in client; 
... 
alen = sizeof(client); 
new_fd = accept(sockfd, (struct sockaddr *) &client, &alen); 

acceptは、それはあなたが2個のエラーを持っている中で、あなたがポインタの大きさにALEN設定埋めるよ既存のバッファへのポインタを期待し、あなたが合格します受け入れられる初期化されていないポインタ。 accept(2) manページから

+0

クイックヘルプEric!あなたの提案は問題を解決しました。すてきな一日を! – Florian

0

:あなたはclient適切に割り当てられてきたことを確認する

EFAULT The addr argument is not in a writable part of the user address 
      space. 

チェック。

関連する問題