0

UNIXソケットを使用して単純なクライアントサーバーシステムを作成しています。クライアントプログラムを端末から実行すると、セグメンテーション違反が発生します。

seg-faultはnoobエラーが原因であると確信していますが、KDBG(kde gdbフロントエンド)を使用してデバッグしようとすると問題が発生します。

これはそれが壊れるところです:

 if (DEBUG) printf("-- connect()... \n");
 if (connect (mySocket, (struct sockaddr *)socketAddr,sizeof (*socketAddr)) == -1) {
  perror(error);
  printf("%s\n",error);
  printf ("-- Error when stablishing a connection\n");
  return -1;
 }

そしてこれは出力です:

-- connect()... 
Connection refused

-- Error when stablishing a connection

このコードをそのようにデバッグすることはできませんか?なんで?

できれば、今何が起こっているのですか?より多くの情報を取得するにはどうすればよいですか?

PS:PS:@abelenky:その部分はデバッガーから完全に機能します。これはsocketAddrの宣言です:

struct sockaddr_in socketAddr; 

... 

if ( (mySocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    printf("Error al crear el socket\n"); 
    return -2; 
}
4

1 に答える 1

0

これらの関数は文字列を想定しており、別のものを渡しています。

例えば:

perror("socket");

が宣言されているコードからはわかりませんがerror...おそらくerrno、整数のグローバル変数を考えていますか?

ちなみに、これperrorとほぼ同等です:

void perror(const char *str)
{
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
}

コメントに基づく更新:

その場合、私の推測では、あなたは何も初期化していないと思いますerror...あなたが何を期待しているのかわかりませんerrorが、たとえば、何かを試してみたいと思うかもしれません:

snprintf(error, sizeof(error), "Error in %s:%d\n", __FILE__, __LINE__);
perror(error);

更新 2:

私はあなたがこれを望んでいると思います:

if (connect (mySocket, (struct sockaddr *)&socketAddr, sizeof (socketAddr)) == -1) {

&前に を追加し、 から を削除したことに注意してsocketAddrください。*sizeof

ホスト名の検索はどのように行っていますか? getaddrinfoたとえば、次のことをお勧めします。

struct addrinfo *res = NULL, hint;
char service[32];
int error;

snprintf(service, sizeof(service), "%d", port);

memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo(host, service, &hint, &res)))
{
   fprintf(stderr, "No se pudo encontrar %s: %s\n", host, gai_strerror(error));
}
else
{
   fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
   if (fd < 0)
   {
      perror("Error al crear el socket");
   }
   else if (connect(fd, res->ai_addr, res->ai_addrlen))
   {
      perror("Error al conexionar con el servidor");
      close(fd);
      fd = -1;
   }
}

if (res)
{
   freeaddrinfo(res);
}

これによりsockaddr、IPv4、IPv6 などを気にせずにホスト名とポートから取得できます。

于 2010-11-07T01:55:41.490 に答える