2012-03-13 25 views
1

我正在尝试编写一组使用poll()系统调用的简单客户端/服务器程序。虽然我的代码在运行程序时完美编译,但客户端和服务器都不显示输出。此外,客户继续采取投入,永不停止。 这里是服务器代码:使用套接字的基于轮询的客户端服务器API

#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')。 – 2012-03-13 06:43:40

回答

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; 
} 
相关问题