C言語でunix_socketを作成する



以前、nginx+fcgiwrapの動作環境を作成しましたが、
fcgiwrapを起動するために、perlでunixソケットを
作成しています。

fcgiwrapを起動したらunixソケットを作成して
待ちうけてくれればいいのに・・・

ということで、fcgiwrapをカスタマイズすべく
C言語でunixソケットの作成方法を調べてみました。

※C言語を書くのは7年ぶりです。


まず、unixソケットを作成するサーバープログラム


■server.c


#include 
#include 
#include 
#include 
#include 
#include 

#define ADDRESS "mysocket"

main()
{
  char c;
  FILE *fp;
  int i, s, ns, len, fromlen;
  struct sockaddr_un saun, fsaun;
  char buf[1024];

  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
    perror("server: socket");
    exit(1);
  }

  saun.sun_family = AF_UNIX;
  strcpy(saun.sun_path, ADDRESS);

  unlink(ADDRESS);
  len = sizeof(saun.sun_family) + strlen(saun.sun_path);

  if ((bind(s, (struct sockaddr *)&saun, len)) < 0) {
    perror("server: bind");
    exit(1);
  }

  if ((listen(s, 5)) < 0) {
    perror("server: listen");
    exit(1);
  }

  while(1) {

    if ((ns = accept(s, (struct sockaddr *)&fsaun, &fromlen)) < 0) {
      perror("server: accept");
      exit(1);
    }

    read(ns, buf, 1024);

    printf("%s\n",buf);

    write(ns, "servercall",1024);
    close(ns);
  }
  close(s);
}



次にサーバソケットに接続して、リクエストを送信するプログラム

■client.c


#include 
#include 
#include 
#include 
#include 
#include 

#define ADDRESS "mysocket"

int main(void)
{
  char c;
  FILE *fp;
  int i, s, len;
  struct sockaddr_un saun;
  char buf[1024];

  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
    perror("client: socket");
    exit(1);
  }

  saun.sun_family = AF_UNIX;
  strcpy(saun.sun_path, ADDRESS);

  len = sizeof(saun.sun_family) + strlen(saun.sun_path);

  if ((connect(s, (struct sockaddr *)&saun, len)) < 0) {
    perror("client: connect");
    exit(1);
  }

  scanf("%s",buf);

  write(s, buf, strlen(buf)+1);
  read(s, buf, strlen(buf)+1);
  printf(buf);
  close(s);

  return 0;

}



それぞれコンパイル

gcc -o server server.c
gcc -o client client.c



まずは、serverを実行しておきます。
その後、clientを実行して、文字を入力すると、
サーバにその文字が表示されるはず。


・・・C言語触っていたのは若造のころなので、よくわからん。

C言語の勉強を開始しようかと。
最終目標はnginxのアドオンをかけるようになるところです。





もどる