2

「The Linux Programming Interface」を読んで、ソケット、特に UNIX ドメイン ソケットについて学びました。いくつかの一般的な概念を説明している第 56 章を読み、第 57 章のクライアント/サーバーの例を実装しようとしています。

サーバー コードは正常に動作しているように見えますが、クライアントに接続しようとすると、呼び出しがconnect()失敗します。

サーバーコードは次のとおりです。

#include<sys/un.h>
#include<sys/socket.h>
#include<stdio.h>
#define SV_SOCK_PATH "/tmp/boom"
#define BUF_SIZE 100
#define BACKLOG 5

int main(int argc, char *argv[]){
  struct sockaddr_un addr;
  int sfd, cfd;
  ssize_t numRead;
  char buf[BUF_SIZE];

  sfd = socket(AF_UNIX, SOCK_STREAM, 0);
  if(sfd!=0){
    printf("socket success\n");
  }
  else{
    printf("socket unsuccessful\n");
  }


  printf("socket declared\n");

  memset(&addr, 0, sizeof(struct sockaddr_un));
  addr.sun_family = AF_UNIX;
  strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);

  if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un))!=0){
    printf("bind unsuccessful\n");
  }
  else{
    printf("bind successful\n");
  }


  if (listen(sfd, BACKLOG) != 0){
  printf("listen failed\n");
  }
  else{
     printf("listen succeeded\n");
  }

  while(1){

    if( cfd = accept(sfd, NULL,NULL) != 0){
      printf("accept failed\n");
    }
    else{
      printf("accept succeeded\n");
    }

     while ((read(cfd, buf, BUF_SIZE)) > 0)
      write(1, buf, numRead); 
 }

}

クライアントコードは次のとおりです。

#include<stdio.h>
#include<sys/un.h>
#include<sys/socket.h>
#define SV_SOCK_PATH "/tmp/boom"
#define BUF_SIZE 100
#define BACKLOG 5


int main(int argc, char *argv[]){
  struct sockaddr_un addr;
  int sfd, cfd;
  ssize_t numRead;
  char buf[BUF_SIZE];

  if(sfd = socket(AF_UNIX, SOCK_STREAM, 0) > 0){
    printf("socket successful\n");
  }
  else{
    printf("socket fucked\n");
  }

  memset(&addr, 0, sizeof(struct sockaddr_un));
  addr.sun_family = AF_UNIX;
  strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);

  if(connect(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1){
    printf("connection unsuccessfully\n");
   }
  else{
     printf("connection successful\n");
  }

  if(numRead = read(0, buf, BUF_SIZE) > 0){
    printf("read successful\n");
    printf(buf);
  }
  else{
    printf("read unsuccessful\n");
  }

  if (write(sfd, buf, numRead) > 0){
    printf("write successful\n");
  }
  else{
    printf("write unsuccessful\n");
  }
}  

サーバーを実行すると、次のように表示されます。

$ ./server 
socket success
socket declared
bind successful
listen succeeded

クライアントを実行すると、次のように表示されます。

$ ./client 
socket successful
connection unsuccessfully
hello   # <-- I type this
read successful
hello
hwrite successful

誰かがこれで私を助けることができれば、私はとても感謝しています.

4

1 に答える 1

3

クライアントでこのコードを囲む括弧がありません

if(sfd = socket(AF_UNIX, SOCK_STREAM, 0) > 0){

に変更します

if((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) > 0){

また、サーバー コードを次のように変更しました。

.
.
.

socklen_t csize; 

while(1){

    cfd = accept(sfd, (struct sockaddr *)&addr,&csize);

    if (cfd < 0) {
      printf("accept failed: %s\n", strerror(errno));
    }
    else{
      printf("accept succeeded: %d\n", cfd);
    }

    .
    .
    .

そして今、それは動作するはずです:)

常に演算子の優先順位に注意してください!

于 2013-03-27T15:27:46.183 に答える