2016-12-03 14 views
0

私はCプログラミングには新しいので、自分自身にメッセージを送り、メッセージを受け取り、返信するプログラムを書こうとしています。私はexampleのクライアントとサーバープログラムを見つけました。基本的にそれをコピーして、いくつかの変更を加えようとしました。プログラムはクラッシュするだけでなく、 "ur message"を出力します。コードのどこにも "ur message"という文字列がありますので、毎回これを出力することは可能でしょうか?ソケットを使用しようとしているときに奇妙な "urメッセージ"を出力するプログラム

大量のコードを貼り付けることについてお詫び申し上げますが、私は問題がどこにあるのかわかりませんし、関連性のあるものは残したくありません。どんな助けでも大変感謝します。あなたが割り当てられていないバッファを使用している

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

#include <pthread.h> 

char *write_buffer_to_port(char *host, int portno); 
char *listen_on_port(int portno); 
void* listen_thread(void *arg); 
char *buffer_a; 
char *buffer_b; 

int main(int argc, char *argv[]) { 
    buffer_a = "test"; 
    buffer_b = ""; 
    pthread_t tid[2]; 
    pthread_create(&(tid[1]), NULL, &listen_thread, NULL); 
    printf("%s",write_buffer_to_port("localhost", 5737)); 
} 

char *write_buffer_to_port(char *host, int portno) { 
    int sockfd, n; 

    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) exit(1); 

    server = gethostbyname(host); 
    if (server == NULL) exit(2); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
    (char *)&serv_addr.sin_addr.s_addr, 
    server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) exit(3); 
    n = write(sockfd, buffer_a, strlen(buffer_a)); 
    if (n < 0) exit(4); 

    n = read(sockfd, &buffer_a, 255); 
    if (n < 0) exit(5); 
    close(sockfd); 
    return (char *)buffer_a; 
} 

char *listen_on_port(int portno) { 
    int sockfd, newsockfd, clilen; 

    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) exit(1); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
         sizeof(serv_addr)) < 0) exit(2); 
    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); 
    if (newsockfd < 0) exit(3); 
    //bzero(buffer_a,256); 
    n = read(newsockfd,&buffer_b,255); 
    if (n < 0) exit(4); 
    //printf("Here is the message: %s\n",(char *)&buffer_b); 
    n = write(newsockfd,"I got your message",18); 
    if (n < 0) exit(5); 
    return (char *)&buffer_b; 
} 

void* listen_thread(void *arg) { 
    printf("rcvd: %s\n",listen_on_port(5737)); 
    return NULL; 
} 
+0

初心者がなぜこのような複雑なもの(マルチスレッドのクライアント/サーバー)で始まるのか、私はいつも不思議です。メカニカルエンジニアになろうとしたら、飛行機ではなく、自転車や碁カードでロケットで始めるのではないでしょうか? – alk

+0

@alk真実ですが、私が望んでいないものを作る意欲を持たせることは非常に困難です。興味深いプロジェクトに取り組んで、必要なものを手に入れて必要なものを学ぶのはなぜですか?それは何でも構いませんが、一日の終わりにはクールなプロジェクトとかなり良いスキルに終わるでしょう。そして私はちょうどプログラミングの初心者ではありません。 – Jake

答えて

2

「ur message」は「あなたのメッセージがあります」の終わりです。

buffer_aおよびbuffer_bは正しく使用されていません。あなたが宣言した通り、彼らはcharへのポインタです。 read(fd, &buffer_b, 255)を実行すると、一部のバッファではなく、ポインタbuffer_bが占有するメモリに読み込み中です。

バッファに読み込みたい場合は、バッファを読み込むためのスペースを持つオブジェクトとして宣言するか、ポインタとして宣言してmallocを呼び出してメモリを割り当てます。バッファをchar buffer_a[256]と宣言すると、そのバッファに読み込むことができます。その宣言は256バイトを予約し、buffer_aはそのメモリの先頭アドレスです。次に、read(fd, buffer_a, sizeof(buffer_a))を実行してバッファーに読み込むことができます。

書き込みしようとしている文字列にbuffer_aを初期化しようとしていますが、配列として宣言していればそれでも可能ですが、文字列自体を書く方が簡単です。

+0

ああ。元のコードはbuffer [256]でしたが、印刷したり返すことができなかったので変更しました。 char [256]を返す関数を持つにはどうすればよいですか? – Jake

+1

関数は 'char *'( 'char'の配列の名前は定数' char * 'のように振る舞います)を返します。 –

0

、 のchar * buffer_a。 char * buffer_b; これを修正するには、メイン(malloc)に割り当てるか、配列として宣言します。

関連する問題