【ただの技術備忘録】【第2回】LinuxC、ソケットプログラミング初歩
予告どおり、さくっとプログラムを記載。このプログラムは基本的にLinuxのGCCで組むので、Widows諸君はWinsockの参考書片手に、概念だけ理解していただけると助かる。
サーバプログラム「server.c」
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main (int argc, char *argv[]) { //ソケットファイルディスクリプタ int server_sockfd, client_sockfd; //ソケットサイズ代入用変数 int server_len, client_len; //ソケットの構造体 struct sockaddr_in server_address; struct sockaddr_in client_address; //ソケットを生成 server_sockfd = socket(AF_INET,SOCK_STREAM ,0); //ソケット構造体にパラメータを設定 server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); server_address.sin_port = 7743; //構造体のサイズを取得 server_len = sizeof(server_address); //ソケットファイルディスクリプタとソケット構造体を結びつけ //俗に言う「ソケットに名前をつける」行為だと思う bind(server_sockfd,(struct sockaddr *)&server_address,server_len); //接続キューを作成する //この場合は接続キューを5個作成 listen(server_sockfd,5); //無限ループ while(1) { //受信用変数、送信用変数 char recv; char send; //接続要求を受け入れる client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); //なんか処理 //client_sockfdから受信変数に1バイト読み込み //インクリメントして送信変数に代入 //client_sockfdに送信変数から1バイト書き込み read(client_sockfd, &recv,1); send = recv+1; write(client_sockfd, &send, 1); //クライアントソケットを閉じる close(client_sockfd); } }
クライアントプログラム「client.c」
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> int main (int argc, char *argv[]) { //ソケットファイルディスクリプタ int sockfd; //ソケットサイズ代入用変数 int len; //ソケットの構造体 struct sockaddr_in address; //接続結果代入用変数 int result; //受信用変数、送信用変数 char send = 'a'; char recv; //ソケットを生成 sockfd = socket(AF_INET, SOCK_STREAM, 0); //ソケット構造体にパラメータを設定 address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_port = 7743; //構造体のサイズを取得 len = sizeof(address); //サーバに接続要求を出す //許可されれば接続する result = connect(sockfd,(struct sockaddr *) &address, len); //接続許可が下りなければ //-1が返ってくるのでエラー処理 if(result == -1) { printf("Server connection err\n"); exit(1); } //送受信 write(sockfd,&send,1); read(sockfd,&recv,1); //受信したものを表示 printf("Recv:%c\n",recv); //接続を閉じる close(sockfd); return 0; }
解説は次回。