0

cで単純なTCPクライアントサーバーを作成し、クライアントからサーバーにメッセージを送信しようとしていますが、いくつか問題があります。サーバーはメッセージを送信しますが(整数値> 0)、クライアントはメッセージを受信できません(整数値> 0)。コードは次のとおりです。クライアント

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




int main()
{
    int s_id;
    char *msg = "hello";
    struct sockaddr_in serv_addr;
    s_id = socket (AF_INET, SOCK_STREAM, 0);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons (1156);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(s_id,(struct sockaddr *) &serv_addr, sizeof (struct sockaddr));
    int r = recv (s_id, (char *) msg, 9, 0);
    printf("%d \n", r );
    printf("%s \n", msg );

    return 0;
}

サーバ:

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

int main()
{
       int s_id;
       char *msg = "connected";
       struct sockaddr_in my_addr, remote_addr;
       s_id = socket (PF_INET,SOCK_STREAM,0);
       my_addr.sin_family = AF_INET;
       my_addr.sin_port = htons(1156);
       my_addr.sin_addr.s_addr  = inet_addr("127.0.0.1");

       bind(s_id,(struct sockaddr *) &my_addr, sizeof(struct sockaddr));
       listen (s_id,5);
       int size = sizeof (struct sockaddr_in);
       int new_sd = accept (s_id, (struct sockaddr *) &remote_addr, &size);
       int s= send(new_sd, (void *)msg, 9, 0);
       printf("%d \n", s );
       return 0;
}

私が取得する出力(最初にサーバーを起動し、次にクライアントを起動した後)は、サーバー側:9クライアント側:-1 hello

Ubuntu11.04とgccコンパイラを使用しています。

誰かが助けてくれることを願っています。ありがとうございました

ウマル

4

2 に答える 2

2
char *msg = "hello";

これは文字列リテラルです。これは定数であり、変更することはできません。

int r = recv (s_id, (char *) msg, 9, 0);

そして、あなたはそれに書き込もうとしています。

宣言を次のように変更します。

char msg[20];
memset(msg, 0, sizeof(msg));

その変更を行うと、コードは期待どおりに機能します。

Cでは、バッファを割り当てて管理する必要があります-フリーランチはありません:)

Nikolai N Fetissovからの他の回答にも注意してください。実際には、すべてのシステムコールからのリターンコードを確認する必要があります。

于 2011-09-09T18:58:15.833 に答える
1

システムコールの後にエラーをチェックすることはありません。socket(2)、などのすべてが失敗するとconnect(2)返さ-1れ、関数などを使用してエラーの説明を出力できますperror(3)。各システムコールのマニュアルページには、考えられるエラーがリストされています。

編集0:

本当の問題は、おそらくブライアンが指摘していることです。クライアントの読み取り専用メモリにデータを受信しようとしています。セグメンテーション違反で死ぬのですか?

于 2011-09-09T18:57:25.557 に答える