はじめに
これはWindows10で仮想環境を使用してLinuxを動かしています。
開発環境
Windows10
Virtual Box Ubuntu 22.04 LTS
VSCode(C++)
コード
サーバー側
Server.cpp
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include<string>
#include<iostream>
int main() {
int sockfd;
int client_sockfd;
sockaddr_in addr;
socklen_t len = sizeof( sockaddr_in );
sockaddr_in from_addr;
char buf[1024];
// 受信バッファ初期化
memset( buf, 0, sizeof( buf ) );
// ソケット生成
sockfd = socket( AF_INET, SOCK_STREAM, 0 );
int port=12345;
std::cout << "ポート番号を入力" << std::endl;
std::cin >> port;
// 待ち受け用IP・ポート番号設定
addr.sin_family = AF_INET;
addr.sin_port = htons( port );
addr.sin_addr.s_addr = INADDR_ANY;
// バインド
bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ));
// 受信
listen( sockfd, SOMAXCONN );
// コネクト
client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len );
// 受信
int rsize;
while( 1 )
{
rsize = recv( client_sockfd, buf, sizeof( buf ), 0 );
if ( rsize == 0 )
{
break;
}
else
{
std::cout<<"recvData "<< buf << std::endl;
sleep( 1 );
std::string a=" Linux Server";
std::cout<<"sendData "<< a <<std::endl;
write( client_sockfd, a.c_str(), rsize );
}
}
// ソケットクローズ
close( client_sockfd );
close( sockfd );
return 0;
}
クライアント側
Client.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<iostream>
#include<string>
int main() {
int sockfd;
struct sockaddr_in addr;
// ソケット生成
sockfd = socket( AF_INET, SOCK_STREAM, 0);
int port = 12345;
std::cout << "ポート番号を入力" << std::endl;
std::cin >> port;
std::string addrNum;
std::cout << "接続するIPアドレス" << std::endl;
std::cin >> addrNum;
// アドレス&ポート番号設定
addr.sin_family = AF_INET;
addr.sin_port = htons( port );
addr.sin_addr.s_addr = inet_addr( addrNum.c_str() );
// サーバ接続
connect( sockfd, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ) );
// データ送信
std::string str;
std::cout<<"送信したいデータ"<<std::endl;
std::cin>>str;
const char* data[100]{str.c_str()};
char recvData[1000];
for ( int i = 0; i < 10; i++ )
{
send( sockfd, *data, 100, 0 );
recv( sockfd, recvData, sizeof(recvData), 0 );
std::cout<<"recvData "<<data<<std::endl;
sleep(1);
}
// ソケットクローズ
close( sockfd );
return 0;
}
さいごに
前に書いた記事ではwindowsからliunxへの片方向の送信でしたが今回は双方向で送信を行っています。
参考にさせていただいたサイト様