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のアドオンをかけるようになるところです。
もどる