0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Liunx同士でソケット通信するTCP

Last updated at Posted at 2023-06-09

はじめに

これは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への片方向の送信でしたが今回は双方向で送信を行っています。

参考にさせていただいたサイト様

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?