Опросный клиентский сервер с использованием сокетов API - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь написать набор простых программ клиент / сервер, использующих системный вызов 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);
}

Было бы очень полезно, если бы вы могли помочь мне выяснить, что вызывает такое поведение и как остановить это и правильно запустить программу.

1 Ответ

2 голосов
/ 13 марта 2012

Не знаю, понимаете ли вы это, но ваш сервер практически ничего не делает, пока не примет 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;
}
...