LinuxとC/C++によるソケット通信サンプル
C/C++によるソケット通信サンプルを紹介します。
1.はじめに
Linux上で動作する、C++のソケット通信サンプルを作ってみました。
使い方は、サーバ・クライアントそれぞれのプログラムをビルドし、2つのターミナルを使ってサーバ→クライアントの順で起動すると、クライアントからサーバに簡単な文字列を送信し、サーバからクライアントにその文字をそのまま返送し、それぞれのターミナルに実行状況を表示します。
2.サーバプログラム(server.cpp)
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int sockfd;
int client_sockfd;
struct sockaddr_in addr;
socklen_t len = sizeof( struct sockaddr_in );
struct sockaddr_in from_addr;
char buf[1024];
// 受信バッファ初期化
memset( buf, 0, sizeof( buf ) );
// ソケット生成
if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
perror( "socket" );
}
// 待ち受け用IP・ポート番号設定
addr.sin_family = AF_INET;
addr.sin_port = htons( 1234 );
addr.sin_addr.s_addr = INADDR_ANY;
// バインド
if( bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ) {
perror( "bind" );
}
// 受信待ち
if( listen( sockfd, SOMAXCONN ) < 0 ) {
perror( "listen" );
}
// クライアントからのコネクト要求待ち
if( ( client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len ) ) < 0 ) {
perror( "accept" );
}
// 受信
int rsize;
while( 1 ) {
rsize = recv( client_sockfd, buf, sizeof( buf ), 0 );
if ( rsize == 0 ) {
break;
} else if ( rsize == -1 ) {
perror( "recv" );
} else {
printf( "receive:%s\n", buf );
sleep( 1 );
// 応答
printf( "send:%s\n", buf );
write( client_sockfd, buf, rsize );
}
}
// ソケットクローズ
close( client_sockfd );
close( sockfd );
return 0;
}
3.クライアントプログラム(client.cpp)
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int sockfd;
struct sockaddr_in addr;
// ソケット生成
if( (sockfd = socket( AF_INET, SOCK_STREAM, 0) ) < 0 ) {
perror( "socket" );
}
// 送信先アドレス・ポート番号設定
addr.sin_family = AF_INET;
addr.sin_port = htons( 1234 );
addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
// サーバ接続
connect( sockfd, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ) );
// データ送信
char send_str[10];
char receive_str[10];
for ( int i = 0; i < 10; i++ ){
sprintf( send_str, "%d", i );
printf( "send:%d\n", i );
if( send( sockfd, send_str, 10, 0 ) < 0 ) {
perror( "send" );
} else {
recv( sockfd, receive_str, 10, 0 );
printf( "receive:%s\n", receive_str );
}
sleep( 1 );
}
// ソケットクローズ
close( sockfd );
return 0;
}
4.プログラムのビルド
% g++ -o server server.cpp
% g++ -o client client.cpp
5.プログラムの実行
% ./server
% ./client
Posted by yujiro このページの先頭に戻る
トラックバックURL
コメントする
greeting