2016-03-31 4 views
-4

以下のコードは機能しません。私は今解決のために一日を探していますが、驚くほどのところどこにもいません。 "hello"という言葉をtcpサーバに送ると、 "it works"というテキストを印刷したいと思っています。問題は97行目です。私は何が起こっているのか分かり次第、投稿のタイトルを編集します。Cで2つの文字列/バッファを比較する可能性があります

#include<stdio.h> 
#include<string.h> //strlen 
#include<stdlib.h> //strlen 
#include<sys/socket.h> 
#include<arpa/inet.h> //inet_addr 
#include<unistd.h> //write 
#include<pthread.h> //for threading , link with lpthread 
void *connection_handler(void *); 

int main(int argc , char *argv[]) 
{ 
    int socket_desc , new_socket , c , *new_sock; 
    struct sockaddr_in server , client; 
    char *message; 

    //Create socket 
    socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
    if (socket_desc == -1) 
    { 
     printf("Could not create socket"); 
    } 

    //Prepare the sockaddr_in structure 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(9999); 

    //Bind 
    if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     puts("bind failed"); 
     return 1; 
    } 
    puts("bind done"); 

    //Listen 
    listen(socket_desc , 3); 

    //Accept and incoming connection 
    puts("Waiting for incoming connections..."); 
    c = sizeof(struct sockaddr_in); 
    while((new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))) 
    { 
     puts("Connection accepted"); 

     //Reply to the client 
     message = "Hello Client , I have received your connection. And now I will assign a handler for you\n"; 
     write(new_socket , message , strlen(message)); 

     pthread_t sniffer_thread; 
     new_sock = malloc(1); 
     *new_sock = new_socket; 

     if(pthread_create(&sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0) 
     { 
      perror("could not create thread"); 
      return 1; 
     } 

     //Now join the thread , so that we dont terminate before the thread 
     //pthread_join(sniffer_thread , NULL); 
     puts("Handler assigned"); 
    } 

    if (new_socket<0) 
    { 
     perror("accept failed"); 
     return 1; 
    } 

    return 0; 
} 
/* 
* This will handle connection for each client 
* */ 
void *connection_handler(void *socket_desc) 
{ 
    //Get the socket descriptor 
    int sock = *(int*)socket_desc; 
    int read_size; 
     char *message , client_message[2000]; 
     //char *contents; 
     //contents = "hello"; 
     //strcpy(mess,contents); 
    //Send some messages to the client 
    message = "Greetings! I am your connection handler\n"; 
    write(sock , message , strlen(message)); 

    message = "Now type something and i shall repeat what you type \n"; 
    write(sock , message , strlen(message)); 

    //Receive a message from client 
    while((read_size = recv(sock , client_message , 2000 , 0)) > 0) 
    { 
     write(sock , client_message , strlen(client_message)); 

ストリングが等しい場合、問題は、この行の下

 char mess[] = "hello\n"; 
     if(strcmp(client_message, mess) != 0){ 
      printf("it works"); 
     } 
    } 
    if(read_size == 0) 
    { 
     puts("Client disconnected"); 
     fflush(stdout); 
    } 
    else if(read_size == -1) 
    { 
     perror("recv failed"); 
    } 

    //Free the socket pointer 
    free(socket_desc); 

    return 0; 
} 
+3

失敗した行にコメントを付けて、問題の内容を正確に説明します。本当に97行をカウントダウンできません。 – sabbahillel

+0

ここでは、通常の容疑者と一緒に行く:recv()によって返された結果を正しく処理できない。 TCPのオクテットストリーミングの性質を処理することができず、TCPがそれ自身で1バイトよりも大きなメッセージを転送できるという前提。 null終端されていないことが保証されているcharバッファに対するstrlen()スタイルの呼び出しの誤用。 –

+0

また、クライアントメッセージがNULで終わると仮定します。 –

答えて

3

strcmp戻りゼロあります。あなたの状態は間違っています。

1)編集1:こんにちはニアライン97は "こんにちは\ n" は

のどちらかですが

あなたが代わりにif (strcmp(...) != 0) ...

+0

ありがとう、本当に物事だった。私はstrcmpがテキストを表示するために0に等しいかどうかを述べた数多くの文を試していましたが、それでもまだ動作しませんでした。私は私のstrcmp状態が間違っていることを私がそれを見ていない方法を知っていない上に間違っていることがわかります。主な問題は、strcmpが2つの文字列を比較していないことでした。あなたの答えは正しいとは別に、 –

1

トップハローのif (! strcmp(...)) printf("it works");を行うべきことは、 "こんにちは"

ですhellosの

2)use stricmp()

+0

__WHAT ??? __これを説明してもらえますか? – ForceBru

+0

@ForceBru:これは有効な観察です。私はそれが*唯一の*問題ではないかもしれないと信じていますが、確かに良いキャッチです。 – usr2564301

+0

** client_message **がどこから来ているのかわかりませんが、**メッセージ**には "Hello"とスペースが含まれています。** mess [] **には "hello"と改行が含まれています。一致を得る最良の方法は、** strnicmp(client_message、mess、5); ** –

1
while((read_size = recv(sock , client_message , 2000 , 0)) > 0) 

recv Linux

すべての3つのルーチンは、成功した場合にはメッセージの長さを返します。

この場合、client_messageに文字列の末尾の文字が含まれているとは限りません。多くの接続では、最後にNULL文字ではなく実際のメッセージ文字のみが送信されます。あなたは

client_message[read_size] = '\0'; 

strlen(client_message)が正しいと特定されるという道を(それが収まると仮定)を追加する必要があります。代わりに使用することができます

write(sock , client_message , read_size); 

メッセージを繰り返しているので、サイズは同じです。

コードのどこかでclient_message文字列を使用する場合は、安全のために '¥0'文字が追加されていることを確認する必要があります。

+0

チップありがとう:) –

関連する問題