Данные не отправлены / получены должным образом - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь реализовать сервер / клиент TCP с использованием сокетов в c.Я написал программу таким образом, чтобы все, что мы отправляем в клиент, отображалось на сервере построчно, пока не был напечатан выход.Программа работает, но данные в последний раз отображаются на сервере.Кто-нибудь может проверить код?

TCP SERVER

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

main()
{
    char buf[100];
    socklen_t len;
    int k,sock_desc,temp_sock_desc;
    struct sockaddr_in client,server;

    memset(&client,0,sizeof(client));
    memset(&server,0,sizeof(server));
    sock_desc = socket(AF_INET,SOCK_STREAM,0);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_port = 7777;

    k = bind(sock_desc,(struct sockaddr*)&server,sizeof(server));
    k = listen(sock_desc,20);
    len = sizeof(client);
    temp_sock_desc = accept(sock_desc,(struct sockaddr*)&client,&len);

    while(1)
        {
        k = recv(temp_sock_desc,buf,100,0);
        if(strcmp(buf,"exit")==0)
            break;

        if(k>0)
            printf("%s",buf);
    }

    close(sock_desc);
    close(temp_sock_desc);
    return 0;
}

TCP CLIENT

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

main()
{
    char buf[100];
    struct sockaddr_in client;
    int sock_desc,k;

    sock_desc = socket(AF_INET,SOCK_STREAM,0);
    memset(&client,0,sizeof(client));
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = inet_addr("127.0.0.1");
    client.sin_port = 7777;

    k = connect(sock_desc,(struct sockaddr*)&client,sizeof(client));

    while(1)
        {
        gets(buf);
        k = send(sock_desc,buf,100,0);

        if(strcmp(buf,"exit")==0)
            break;
    }

    close(sock_desc);
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 03 октября 2011
while(1){
    k = recv(temp_sock_desc,buf,100,0);
    if(memcmp(buf,"exit", 4)==0)
        break;
    if(k>0)
        printf("%*.*s", k, k, buf);
}

Результат recv () не является строкой, поэтому он не будет обнуляться.Вышеупомянутое «исправление» не совсем правильно, но предназначено только для того, чтобы указать вам правильное направление.

1 голос
/ 03 октября 2011

gets () заменяет завершающий символ новой строки на '\ 0'.Результирующая строка отправляется на сервер, который записывает ее на стандартный вывод.Stdout буферизуется, поэтому на экране ничего не будет отображаться до тех пор, пока программа не завершится или не будет напечатано «\ n».

Добавьте «\ n» к вашему printf:

if(k>0)
    printf("%s\n",buf);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...