Программа Socket C не печатает желаемый вывод (без ошибок) - PullRequest
0 голосов
/ 08 июня 2018

Я не могу напечатать то, что я ввожу в мой клиентЯ скомпилировал оба без каких-либо ошибок.Не могу понять, почему он не печатает нужный вывод.

Q.Что не так с моим кодом?Как я могу напечатать строку с пробелами через клиента на сервере.

Вот код для сервера.

/* Server Side program */


    int sid,nid;
    struct sockaddr_in q;
    char x[100];

    int len=sizeof(struct sockaddr_in);

    sid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    q.sin_family=PF_INET;
    q.sin_port=1600;
    q.sin_addr.s_addr=0;

    bind(sid,&q,len);

    listen(sid,20);

    while(1)
    {
            memset(x,0,sizeof(x));
            nid=accept(sid,&q,&len);
            read(nid,x,100);
            printf("%s\n",x);

    }

Вот код для клиента.

/*client side program*/


    int sid,status;
    struct sockaddr_in q;
    int len=sizeof(struct sockaddr_in);
    char x[100];

    sid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
            q.sin_family=PF_INET;                   
            q.sin_port=1600;                        
            q.sin_addr.s_addr=0;                  
    status=connect(sid,&q,len);
    if(status==-1)
    {
            printf("Connection failure");
            exit(0);
    }

    while(1)
    {
            printf("Enter string to send : ");
            scanf("%[^\n]s",x);
            write(sid,x,strlen(x));
            if(strcmp(x,"bye")==0)
                     break;

    }

1 Ответ

0 голосов
/ 09 июня 2018

Существует множество проблем с вашим кодом.Отсутствие обработки ошибок.Неправильное использование printf() и scanf().Утечка ресурсов.

Вместо этого попробуйте что-нибудь подобное:

Сервер:

int main()
{
    int sid, nid;
    struct sockaddr_in q;
    char x[100];
    socklen_t qlen;
    ssize_t xlen;

    sid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sid < 0)
    {
        perror("socket failure");
        return -1;
    }

    q.sin_family = AF_INET;
    q.sin_port = htons(1600);
    q.sin_addr.s_addr = INADDR_ANY;

    if (bind(sid, &q, sizeof(q)) < 0)
    {
        perror("bind failure");
        return -1;
    }

    if (listen(sid, 20) < 0)
    {
        perror("listen failure");
        return -1;
    }

    while(1)
    {
        qlen = sizeof(q);
        nid = accept(sid, &q, &qlen);
        if (nid < 0)
        {
            perror("accept failure");
            return -1;
        }

        while ((xlen = read(nid, x, sizeof(x))) > 0)
        {
            printf("Received: '%.*s'\n", xlen, x);
        }

        if (xlen < 0)
            perror("read failure");
        else
            printf("client disconnected\n");

        close(nid);
    }

    return 0;
}

Клиент:

int main()
{
    int sid, xlen;
    struct sockaddr_in q;
    char x[100];

    sid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sid < 0)
    {
        perror("socket failure");
        return -1;
    }

    q.sin_family = AF_INET;                   
    q.sin_port = htons(1600);
    q.sin_addr.s_addr = inet_addr("server ip here"); // or INADDR_LOOPBACK (127.0.0.1)

    if (connect(sid, &q, sizeof(q)) < 0)
    {
        printf("connect failure");
        return -1;
    }

    while(1)
    {
        printf("Enter string to send : ");
        if (!fgets(x, sizeof(x), stdin))
            break;

        xlen = strlen(x);
        if ((xlen > 0) && (x[xlen-1] == '\n'))
        {
            x[xlen-1] = '\0';
            --xlen;
        }

        if (write(sid, x, xlen) < 0)
        {
            perror("write failure");
            break;
        }

        if (strcmp(x, "bye") == 0)
            break;
    }

    close(sid);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...