2011-11-19 10 views
5

"ソケット"について読んで学びましたが、クライアントとサーバーのためにCで書かれた小さなコードサンプルを探しています。Cでノンブロッキングのクライアントとサーバーソケット

コードはクライアントからの入力を送信できる必要があり、サーバーは非ブロッキング状態の出力を受信できる必要があり、両方が非ブロッキング状態である必要があります。

私はGoogleや書籍、YouTubeで多くを読んだことがありますが、何の助けもありませんでした。私はあなたが、非ブロッキングソケット上でI/Oを実行する方法を求めていると思います

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

int main() 
{ 
    int sock; 
    int addr_len, bytes_read; 
    char recv_data[1024]; 
    struct sockaddr_in server_addr , client_addr; 


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(5000); 

    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    bzero(&(server_addr.sin_zero),8); 


    if (bind(sock,(struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
    { 
     perror("Bind"); 
     exit(1); 
    } 

    addr_len = sizeof(struct sockaddr); 

    printf("\nUDPServer Waiting for client on port 5000"); 
    fflush(stdout); 

    while (1) 
    { 

     bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); // <---- Here is the problem 


     recv_data[bytes_read] = '\0'; 

     printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr), 
       ntohs(client_addr.sin_port)); 
     printf("%s", recv_data); 
     fflush(stdout); 

    } 
    return 0; 
} 

答えて

9

は、これが私のサーバーです。 Beej's guideは長い間ずっと続きました。良いコードサンプルを使ってこれ以上すべてをカバーしています。

+1

こんにちは、私はBeejのガイドを使いましたが、それを得ることができませんでした。代わりにexampelで助けてください。 – user1022734

+1

Beejのガイドはかなり明確で、達成しようとしているもののサンプルプログラムがあります。ガイドの第7章を見てください。最初のコードはクライアントであり、2番目のコードはサーバーです。 – steve

6

ノンブロッキングI/Oのアイデアは、複数スレッドに頼らずに複数のソケットを処理できるようにすることです。ここでの中心部はI/O de-multiplexingであり、すなわちselect(2)またはpoll(2)(またはepoll(7)またはkqueue(2)のようなプラットフォーム固有の機能)へのコールです。

ここでは簡単なintroductionです。

+0

私のサーバーで「select()」を実行するにはどうしたらいいですか? – user1022734

+0

あなたのループは 'select()'で待機し、登録されたソケットのいずれかが(内部ループ内で)読み込み可能であることを確認した後、各アクティブなソケットから読み込みます。 –

+0

コードexampelしてください、私の英語は良くありません – user1022734

関連する問題