0

2 つの C++ ファイルを使用するクライアント - サーバー モデルがあります。クライアントとサーバーはソケットを介して通信します。ユーザーがクライアントの stdin に文字列を入力すると、クライアントはそれをサーバーに渡します。ただし、python プログラムを使用してユーザーをシミュレートしたいと考えています。これは私の試みです:

from subprocess import Popen, PIPE, STDOUT

host_name = raw_input("Enter host name: ")
port = raw_input("Enter port: ")

p = Popen(["./client", host_name, port], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
p.stdin.write("DEVICE:3:MALFUNCTIONING")

これはうまくいきません。クライアント プロセスと引数を開始しますが、文字列 DEVICE:3:MALFUNCTIONING を書き込みません。なにか提案を?

これは簡単に私のクライアントコードです:

if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");

printf("Please enter the message: ");
memset(buffer, 0, 256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
        error("ERROR writing to socket");
memset(buffer, 0, 256);
n = read(sockfd,buffer,255);
if (n < 0)
        error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
4

1 に答える 1

0

クライアントとサーバーをどのように作成したかはわかりませんが、ユーザーをシミュレートするpythonプログラムの実装とほとんど同じである私の実装を次に示します。

Github 要点: https://gist.github.com/yanhan/5791613

クライアントのコード スニペットに基づいて、何がうまくいかないのか、いくつかの疑いがあります。

  1. server_addr 変数が正しく設定されていません
  2. サーバーコードのバグ

mata が言ったように、stdout/stderr およびスタック トレースからの出力を表示できれば、より役に立ちます。

編集:次のリンクが役立つ可能性があることを追加したかっただけです:

便宜上、ここにコードを貼り付けます。

sim.py:

from subprocess import Popen, PIPE

def run():
    # this should work if you change to
    #   host_name = raw_input
    #   port = raw_input
    host_name = '127.0.0.1'
    port = '8124'
    p = Popen(['./client', host_name, port], stdin=PIPE, close_fds=True)
    myInput = raw_input()
    p.stdin.write(myInput)
    p.communicate()

if __name__ == '__main__':
    run()

client.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define BUFSZ 256

int main(int argc, char *argv[])
{
    int sockfd, ret, exitCode = 0;
    char buffer[BUFSZ];
    memset(buffer, 0, BUFSZ);
    fgets(buffer, sizeof(buffer), stdin);
    char *hostname = argv[1];
    int port = atoi(argv[2]);
    // echo out the stuff just to see
    printf("hostname = %s\n", hostname);
    printf("port = %d\n", port);
    printf("msg = %s\n", buffer);
    // creates the socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        fprintf(stderr, "client: socket() failed\n");
        exit(1);
    }
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(struct sockaddr_in));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(port);
    sockAddr.sin_addr.s_addr = inet_addr(hostname);
    // connect to server
    ret = connect(sockfd, (const struct sockaddr *)&sockAddr, sizeof(struct sockaddr));
    if (ret == -1) {
        fprintf(stderr, "client: connect failed\n");
        exitCode = 1;
        goto done;
    }
    // send buffer
    ssize_t charsSent = send(sockfd, buffer, strlen(buffer)+1, 0);
    printf("client: chars sent: %d\n", (int)charsSent);
    /*
    // this seems to work as well
    write(sockfd, buffer, strlen(buffer)+1);
    */

done:
    close(sockfd);
    return exitCode;
}

サーバー.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORTNUM 8124
#define BUFSZ 256

int main(int argc, char *argv[])
{
    char buf[BUFSZ];
    int ret, exitCode = 1;
    // create socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    int recvFd;
    if (sockfd == -1) {
        fprintf(stderr, "server: Error creating socket\n");
        exit(1);
    }
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(struct sockaddr_in));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(PORTNUM);
    sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // bind socket
    ret = bind(sockfd, (const struct sockaddr *)&sockAddr, sizeof(struct sockaddr));
    if (ret == -1) {
        fprintf(stderr, "server: bind failed\n");
        exitCode = 1;
        goto done;
    }
    // listen for connection. max of 1 connection
    ret = listen(sockfd, 1);
    if (ret == -1) {
        fprintf(stderr, "server: listen failed\n");
        exitCode = 1;
        goto done;
    }
    struct sockaddr_in dest;
    socklen_t sockLen;
    ssize_t bytesReceived;
    while (1) {
        // accept connection from client
        recvFd = accept(sockfd, (struct sockaddr *)&dest, &sockLen);
        if (recvFd == -1) {
            fprintf(stderr, "server: accept failed\n");
            exitCode = 1;
            break;
        }
        // receive message from client
        bytesReceived = recv(recvFd, buf, BUFSZ, 0);
        if (bytesReceived == -1) {
            fprintf(stderr, "server: recv failed\n");
            exitCode = 1;
            break;
        } else {
            printf("server: received %s", buf);
            fflush(stdout);
        }
    }
done:
    close(sockfd);
    return exitCode;
}
于 2013-06-16T10:29:52.257 に答える