1

最近、C でのソケット プログラミングに関する基本的なことを読み、この基本的な知識を実践するために、ユーザーと IRC サーバーの間で少し会話を行うだけのプログラムを作成しようとしました。

関連するコードは次のとおりです。

通信ソケットの初期化:

void init(char *s[])
{
    struct sockaddr_in server;
    printf("%s : connect . . .\n",s[0]);
    server.sin_family = AF_INET;
    inet_pton(AF_INET,s[1],&server.sin_addr.s_addr);
    server.sin_port = htons(atoi(s[2]));
    if((sock = socket(AF_INET,SOCK_STREAM,0))!= 0)
        printf("%s : socket succesfully initialized.\n",s[0]);
    if(connect(sock,(struct sockaddr *)&server,sizeof(server))==0)
        printf("%s : succesfully connected.\n",s[0]);
}

メッセージの送信:

void putmessage(char *s)
{
    write(sock,s,sizeof(s));
}

/*--------*/
(...)
    do
    {
        scanf("%s",input);
        putmessage(strcat(input,"\r\n"));
    }while(strcmp(input,"quit"));
(...)

メッセージの受信:

char *getmessage(void)
{
    int i,t = 0;
    char *p1,*p2;
    p1 = malloc(sizeof(*p1));
    *p1 = '\0';
    p2 = malloc(sizeof(*p2));
    *p2 = '\0';
    do
    {
         i = read(sock,buf,BUFSIZE-1);
         buf[i] = '\0';
         t += i+1;
         p2 = malloc(t);
         strcpy(p2,p1);
         strcat(p2,buf);
         free(p1);
         p1 = p2;
    }while(i == BUFSIZE-1);
    return p1;
}

これは、プロセスを fork した後に無限に呼び出され、1 つを受信用に、もう 1 つを送信用に使用します。私が試したさまざまな irc サーバー (irc.quakenet.org、irc.debain.org/com) から受け取ったメッセージは常に、送信したメッセージに関連するエラーメッセージであり、パラメーターが不足しているため、通信は基本的に機能します。

ここで私の質問は、telnet クライアントを介してこれらの irc ネットワークに正しく接続できるのに、同じメッセージ (PASS、NICK、USER) を使用する自分のコードでは接続できないのはなぜですか。エンコーディングなど、私にとって重要なことは何ですか(gccは一般的にどのエンコーディングを使用しますか?)?

プログラムは Ubuntu 12.04 で実行されます。さらに詳しい情報が必要な場合は、お問い合わせください。

4

1 に答える 1

2

ソケットファイル記述子に書き込もうとしている方法のため、クライアントは入力のメッセージ全体を送信していません。

void putmessage(char *s)
{
    write(sock,s,sizeof(s));
}

ポインターのサイズであるバイトsizeofを送信するため、この場合は演算子を使用する必要はありません。sizeof(char*)

代わりに次のようなものを使用する必要がありますstrlen(s)

于 2012-10-07T08:41:44.087 に答える