C 使用套接字API的基于轮询的客户端服务器

C 使用套接字API的基于轮询的客户端服务器,c,sockets,tcp,network-programming,C,Sockets,Tcp,Network Programming,我正在尝试编写一组简单的客户机/服务器程序,这些程序使用poll()系统调用。虽然我的代码编译得很好,但在运行程序时,客户端和服务器都没有显示任何输出。此外,客户端不断地接受输入,从不停止。 以下是服务器代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include

我正在尝试编写一组简单的客户机/服务器程序,这些程序使用
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
结构pollfd fdarray[5];
内部sfd、端口、nsfd、n、clen、ret、i;
char-str[100];
cadd sadd中的结构sockaddr_;
memset(str,0,sizeof(str));
if((sfd=socket(AF\u INET,SOCK\u STREAM,0))<0){
perror(“无法创建socke\n”);
出口(1);
}
memset(&sadd,0,sizeof(sadd));
//端口=atoi(argv[1]);
sadd.sin_港=htons(9796);
sadd.sin_family=AF_INET;
sadd.sin\U addr.s\U addr=htonl(INADDR\U环回);
if(绑定(sfd,(结构sockaddr*)和sadd,sizeof(sadd))<0){
perror(“绑定到套接字时出错\n”);
出口(1);
}
聆听(sfd,5);
clen=sizeof(cadd);
对于(i=0;i<5;i++){
nsfd=accept(sfd,(结构sockaddr*)和cadd,&clen);
如果(nsfd<0){
perror(“错误接受客户端\n”);
出口(1);
}
fdarray[i].fd=nsfd;
fdarray[i].events=POLLIN;
fdarray[i]。revents=0;
}
ret=轮询(fdarray,5,10);
对于(i=0;i<5;i++){
if(fdarray[i].revents==POLLIN){
n=read(fdarray[i].fd,str,100);
if(n<0)
printf(“错误读取\n”);
printf(“消息是:%s\n”,str);
n=写入(fdarray[i].fd,“收到消息…”,
20);
}
}
返回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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大计数1024
int main(int argc,char*argv[])
{   
int sfd,i;
char msg[MAXCOUNT];
char blanmsg[MAXCOUNT];
saddr中的结构sockaddr_;
memset(&saddr,0,sizeof(saddr));
sfd=套接字(AF_INET,SOCK_STREAM,0);
saddr.sin_family=AF_INET;
内部版本(AF_inet,“127.0.0.1”和saddr.sin_addr);
saddr.sin_港=htons(9796);
连接(sfd,(结构sockaddr*)和saddr,sizeof(saddr));
对于(i=0;i<5;i++){
memset(msg,0,MAXCOUNT);
memset(blanmsg,0,MAXCOUNT);
fgets(味精、最大计数、标准输入);
发送(sfd、msg、strlen(msg)、0);
recv(sfd,blanmsg,sizeof(blanmsg),0);
printf(“%s”,blanmsg);
fflush(stdout);
}
出口(0);
}

如果您能帮助我找出导致这种行为的原因以及如何停止这种行为并正确运行程序,那将非常有帮助

我不知道您是否意识到了这一点,但您的服务器在接受5个客户端连接之前基本上什么都不做

(i=0;i<5;i++)的

{
nsfd=accept(sfd,(结构sockaddr*)和cadd,&clen);
如果(nsfd<0)
{
perror(“错误接受客户端\n”);
出口(1);
}
fdarray[i].fd=nsfd;
fdarray[i].events=POLLIN;
fdarray[i]。revents=0;
}

您还应该在被动侦听套接字上进行轮询。当您可以接受新连接时,它将准备好读取(
POLLIN
)。
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;
}