2013-02-12 11 views
5

Cでネットワークプログラミングを学び始めたばかりですが、いくつかのテストを行いましたが、エラーが発生しました。私は、サーバーを起動するとC - 最初のrecv()コールの後に "トランスポートエンドポイントが接続されていません"

server.c

#include <string.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

#define MYPORT "5996" 
#define BACKLOG 10 

int main(void) 
{ 
    struct sockaddr_storage their_addr; 
    socklen_t addr_size; 
    struct addrinfo hints, *res; 
    int sockfd, new_fd; 

    memset(&hints, 0, sizeof hints); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_PASSIVE; 

    getaddrinfo(NULL, MYPORT, &hints, &res); 

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
    bind(sockfd, res->ai_addr, res->ai_addrlen); 
    listen(sockfd, BACKLOG); 

    addr_size = sizeof their_addr; 
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size); 
    char *msg = "Hello World!!"; 
    int len = strlen(msg); 
    int bs = send(new_fd, msg, len, 0); 
    close(sockfd); 
} 

いるclient.c

#include <string.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <errno.h> 

int main(void) 
{ 
    struct addrinfo hints, *res; 
    int sock; 

    memset(&hints, 0, sizeof hints); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 

    getaddrinfo("localhost", "5996", &hints, &res); 
    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
    connect(sock, res->ai_addr, res->ai_addrlen); 
    char data[64]; 
    int len = 13; 
    int br = recv(sock, data, len, 0); 
    printf("%s\n%s\n%d\n", strerror(errno), data, br); 
    return 0; 
} 

とサーバー:

私はクライアントを持っています、それは待つ接続のために、私は "Hello World !!"というメッセージが表示されますが、1分ほどでサーバーを実行してからクライアントを再起動しようとすると、メッセージが表示されます"トランスポートエンドポイントが接続されていません。 "strerror()コール。

私はこれについて他の質問を読んだが、問題はデータがから返されたソケットに送信されるべきだったということだ。accept()呼び出し...しかし、私はそれをやっていると思う。 私は何が間違っていますか? ...私はそれが何かばかげたことを知っていますが、私は本当の初心者です。

+1

接続に失敗した場合に 'connect()'の戻り値をチェックし、 'errno'を見てください。 –

+0

あなたの記事の最後の段落ありがとう! :)私は完全に私は私のコードでこれを間違って逃した! –

答えて

5

同じポートで毎回サーバーを再起動すると、ポートがOSによって使用中であると見なされている可能性があります。これは、最後に実行されたサーバーからの進行中の要求の配信に時間を費やすためです。

あなたはオペコードSO_REUSEADDR

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
int reuse = 1; 
int err = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); 
if (0 == err) 
    err = bind(sockfd, res->ai_addr, res->ai_addrlen); 

なお、上記のスニペットをチェックし、エラーを返すためにsetsockoptを呼び出すことにより、これをくつがえすことができます。各コールのリターンコードをチェックした場合、問題(解決策ではない場合)を自分で見つけたはずです。

+0

'setsockopt(sockfd、SOL_SOCKET、SO_REUSEADDR、&yes、sizeof(int));のようなものです。私はそれをどこに置くべきですか? – Sylar

+0

あなたのソケットを作成した後で、 'bind'を呼び出す前に。私は答えを明確にするためにコードを更新します。 – simonc

+0

ありがとうございます!できます! ..私は1時間のように立ち往生しました! – Sylar

関連する問題