2017-01-25 16 views
0

UNIXソケットを使用し、STREAMプロトコルを使用してクライアントとサーバー間の通信をしようとしています。UNIXソケットエラー:非ソケットでのソケット操作

私のサーバーは正常に動作していますが、クライアントが動作していません。データを送受信しようとすると、「ソケット以外のソケット操作」というエラーが表示されます。私のサーバーは非常に似ていて、何の問題もないので、どこから来ているのか分かりません。私のサーバは私のローカルマシン(127.0.0.1)とポート5000にあります。これはオープンでリスンしています(netstatコマンドでチェックしました)。

コードがあります:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <errno.h> 

#define CHECK(ret, mes) if ((ret) == -1) {perror(mes); exit(-1);} 

#define STRING_LENGTH 250 

int createSocketINETClient(short mode, char *addr, short port) 
{ 
    int s; 
    struct sockaddr_in moi, server; 
    int moi_len, server_len; 

    moi.sin_family = AF_INET; 
    moi.sin_port = htons(port); 
    moi.sin_addr.s_addr = inet_addr(addr); 

    memset(moi.sin_zero, 0, 8); 

    s = socket(AF_INET, mode, 0); 

    CHECK(s, "socket"); 

    moi_len = sizeof(moi); 

    CHECK(bind(s, (struct sockaddr*) &moi, moi_len), "bind"); 

    return s; 
} 

void infoSocket (int s) 
{ 
    struct sockaddr_in sock_addr; 
    socklen_t len = sizeof(sock_addr); 

    getsockname(s, (struct sockaddr*) &sock_addr, &len); 

    printf("Onfo of socket %d\n", s); 
    printf("\t IP : %s\n", inet_ntoa(sock_addr.sin_addr)); 
    printf("\t port : %d\n\n", ntohs(sock_addr.sin_port)); 
} 

int main() 
{ 
    int bytes; 
    int sock = createSocketINETClient(SOCK_STREAM, "0.0.0.0", 0); 
    struct sockaddr_in serveurSock; 
    int client = 0, clientSockLen = 0; 
    char message[] = "I am a message that is supposed to WORK !!!!\n"; 
    char fromServer[STRING_LENGTH] = ""; 
    infoSocket(sock); 


    serveurSock.sin_family = AF_INET; 
    serveurSock.sin_port = htons(5000); 
    serveurSock.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    memset(serveurSock.sin_zero, 0, 8); 

    CHECK(connect(sock, (struct sockaddr*) &serveurSock, sizeof(serveurSock)), "connect"); 

    usleep(1000000); 

    CHECK((bytes = send(client, message, sizeof(message), 0)), "send"); 
    printf("Message sent to server : %d bytes, \"%s\"\n", bytes, message); 

    CHECK((bytes = recv(client, fromServer, sizeof(fromServer), 0)), "recv"); 
    printf("Message received from server : %d bytes, \"%s\"\n", bytes, fromServer); 

    close(client); 
    printf("Client released !\n\n"); 

    return 0; 
} 

私が間違って何をしたのですか?

EDIT:あなたはint client = 0を初期化し、その後、私はあなたがそれを変更表示されていない投稿のコードでは

CHECK((bytes = send(client, message, sizeof(message), 0)), "send"); 
+0

どの機能からですか? – o11c

+0

エラーの行を含めるように投稿を編集しました。申し訳ありません。 – ZamenWolk

+2

あなたは 'sock'を使用する必要があるところで' client'を使用しています。 – EJP

答えて

0

。実際には、あなたが「靴下」変数を使用する必要があるときにはsendto(へのソケットパラメータとして「クライアント」変数)を使用している

は、あなたがプログラムをstraceの必要があり、次のことを見ることができる:

connect(3, {sa_family=AF_INET, sin_port=htons(5000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 
nanosleep({tv_sec=1, tv_nsec=0}, NULL) = 0 
sendto(0, "I am a message that is supposed "..., 46, 0, NULL, 0) = -1 ENOTSOCK (Socket operation on non-socket) 

実際には3(接続(...)行参照)のときは最初のsendto()パラメータに0(デフォルトではstdinファイル記述子)が書き込まれます。

明示的な理由がある場合(デフォルト以外のルートを使用する、ファイアウォールルールをどこかでバイパスするなど)がない限り、クライアントソケットをbind()する必要はありません。 osはデフォルトで、デフォルトルートが通過するネットワークインターフェイスのIPとランダムな空いているポートを割り当てます。

+0

ありがとう!それは私が見ているばかげたエラーでした...私はソケットの変数としてクライアントを使用することを意味しましたが、私はそれをどこかに混乱させました。 – ZamenWolk

0

:エラーがこの行から来ています。だからsend(0, ...)に電話すると、明らかにそのエラーが発生します。すでに述べたように、あなたは本当にあなたがそれを接続して(sockを使用することを意図していたように見えるので、それはタイプミスすることができ、あなたの質問にコメントして@EJPで言及

sendへの呼び出しでconnect(sock, ...)の代わりclient

関連する問題