2012-03-13 1 views
1

poll()システムコールを使用する単純なクライアント/サーバープログラムのセットを作成しようとしています。私のコードはプログラムを実行している間は完全にコンパイルされますが、クライアントとサーバは出力を表示しません。さらに、クライアントは入力を続け、決して停止しません。ここ は、サーバーコードである:ここでソケットAPIを使用するPollベースのクライアントサーバー

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

int main(int argc, char *argv[]) 
{ 
    struct pollfd fdarray[5]; 
    int sfd, port, nsfd, n, clen, ret, i; 
    char str[100]; 
    struct sockaddr_in sadd, cadd; 
    memset(str, 0, sizeof(str)); 
    if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     perror("Unable to create socke\n"); 
     exit(1); 
    } 
    memset(&sadd, 0, sizeof(sadd)); 
    //port = atoi(argv[1]); 
    sadd.sin_port = htons(9796); 
    sadd.sin_family = AF_INET; 
    sadd.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 

    if (bind(sfd, (struct sockaddr *) &sadd, sizeof(sadd)) < 0) { 
     perror("Error binding to the socket\n"); 
     exit(1); 
    } 
    listen(sfd, 5); 
    clen = sizeof(cadd); 
    for (i = 0; i < 5; i++) { 
     nsfd = accept(sfd, (struct sockaddr *) &cadd, &clen); 
     if (nsfd < 0) { 
      perror("Error accepting client\n"); 
      exit(1); 
     } 
     fdarray[i].fd = nsfd; 
     fdarray[i].events = POLLIN; 
     fdarray[i].revents = 0; 
    } 
    ret = poll(fdarray,5,10); 
    for(i = 0; i < 5; i++) { 
     if (fdarray[i].revents ==POLLIN) { 
      n = read(fdarray[i].fd,str,100); 
      if (n < 0) 
       printf("error reading \n"); 
      printf("message is : %s \n", str); 
      n = write(fdarray[i].fd, "message received...", 
        20); 
     } 
    } 
    return 0; 
} 

は、クライアントコード

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <poll.h> 
#include <unistd.h> 
#define MAXCOUNT 1024 

int main(int argc, char* argv[]) 
{ 
    int sfd,i; 
    char msg[MAXCOUNT]; 
    char blanmsg[MAXCOUNT]; 
    struct sockaddr_in saddr; 

    memset(&saddr,0,sizeof(saddr)); 
    sfd = socket(AF_INET,SOCK_STREAM,0); 
    saddr.sin_family = AF_INET; 
    inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr); 
    saddr.sin_port = htons(9796); 

    connect(sfd,(struct sockaddr*) &saddr, sizeof(saddr)); 
    for(i = 0; i < 5; i++) { 
     memset(msg,0,MAXCOUNT); 
     memset(blanmsg,0,MAXCOUNT); 
     fgets(msg,MAXCOUNT,stdin); 
     send(sfd,msg,strlen(msg),0); 
     recv(sfd,blanmsg,sizeof(blanmsg),0); 
     printf("%s",blanmsg); 
     fflush(stdout); 
    } 
    exit(0); 
} 

は、あなたがこの動作を引き起こし、どのようにこれを停止し、実行することです何かを見つける私を助けることができる場合、それは本当に参考になるでプログラムを正しく。

+0

あなたにも受動的なリスニングソケットにポーリングする必要があります。受け入れ可能な新しい接続があるときは、読み込み( 'POLLIN')の準備が整います。 –

答えて

2

気づいても分かりませんが、5つのクライアント接続を受け入れるまでは基本的に何もしません。

for (i = 0; i < 5; i++) 
{ 
    nsfd = accept(sfd, (struct sockaddr *) & cadd, &clen); 

    if (nsfd < 0) 
    { 
     perror("Error accepting client\n"); 
     exit(1); 
    } 

    fdarray[i].fd = nsfd; 
    fdarray[i].events = POLLIN; 
    fdarray[i].revents = 0; 
} 
関連する問題