Cスタイルのサーバーとクライアントを使用している場合は、次のソケットベースのソリューションを使用して、サーバーからクライアントにデータを転送できます。
解決策は、ホストシステム上で必要なコマンドを実行するためにpopen
関数を使用し、ソケットプログラミング用のsend
およびrecv
プリミティブを使用してデータをクライアントに転送します。次のように
コードは次のとおりです。
SERVER:
#include "stdio.h"
#include "stdlib.h"
#include "sys/socket.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "error.h"
#include "string.h"
#include "unistd.h"
#include "arpa/inet.h"
#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024
main(int argc, char **argv)
{
struct sockaddr_in server;
struct sockaddr_in client;
int sock;
int new,i;
int sockaddr_len = sizeof(struct sockaddr_in);
int data_len;
char data[MAX_DATA];
char temp[MAX_DATA];
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
{
perror("server socket: ");
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[1]));
server.sin_addr.s_addr = INADDR_ANY;
bzero(&server.sin_zero, 8);
if((bind(sock, (struct sockaddr *)&server, sockaddr_len)) == ERROR)
{
perror("bind : ");
exit(-1);
}
if((listen(sock, MAX_CLIENTS)) == ERROR)
{
perror("listen");
exit(-1);
}
printf("\nThe TCPServer Waiting for client on port %d\n",ntohs(server.sin_port));
fflush(stdout);
FILE *fp;
char path[1035];
/* Open the command for reading. */
fp = popen("/bin/ls /etc/", "r");
if((new = accept(sock, (struct sockaddr *)&client, &sockaddr_len)) == ERROR)
{
perror("accept");
exit(-1);
}
printf("New Client connected from port no %d and IP %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr));
data_len = 1;
int path_len;
while (fgets(path, sizeof(path)-1, fp) != NULL) {
path_len = strlen(path);
send(new, path, path_len, 0);
}
printf("Client disconnected\n");
close(new);
close(sock);
}
CLIENT:
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "sys/socket.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "strings.h"
#include "arpa/inet.h"
#define BUFFER 1024
main(int argc, char **argv)
{
struct sockaddr_in serv;
int sock;
char in[BUFFER];
char out[BUFFER];
int len;
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(-1);
}
serv.sin_family = AF_INET;
serv.sin_port = htons(atoi(argv[2]));
serv.sin_addr.s_addr = inet_addr(argv[1]);
bzero(&serv.sin_zero, 8);
printf("\nThe TCPclient %d\n",ntohs(serv.sin_port));
fflush(stdout);
if((connect(sock, (struct sockaddr *)&serv, sizeof(struct sockaddr_in))) == -1)
{
perror("connect");
exit(-1);
}
len = 1;
while(len != 0) {
len = recv(sock, out, BUFFER, 0);
out[len] = '\0';
printf("Output: %s\n", out);
}
close(sock);
}
サーバーのコードは、コマンドライン引数としてポート番号を受け取り、クライアントがIPアドレスを取得します(localhostでは127.0.0.1)、ポート番号はコマンドライン引数として使用します。
他の言語でサーバーを実行している場合でも、そのサーバーのソケットプリミティブを使用してクライアントファイルにデータを送信することができます。
注:コードはC言語で記述されており、C++でコンパイルするとエラーが発生することがあります。コンパイルエラーを確認してください。
netcatのどの実装ですか?いくつかは、あなたがCで行うとしたことを行うことができます。 –
ubuntu 'netcat-openbsd'に付属のものです。それは、代替があると言います。あなたが言うことができるなら、私はとても幸せだろう:) – mjgalindo