Программа клиент-сервер в c вопрос сообщения - PullRequest
0 голосов
/ 05 апреля 2020

Я недавно создал серверную клиентскую программу на c, но она, похоже, не работает. единственное, что я получаю при компиляции, это предупреждение и тот факт, что в клиенте есть ошибка. Может ли кто-нибудь помочь мне немного?

Это код сервера:

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

int main()
{
    int server_socket;
    server_socket = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_address;
    int addrlen = sizeof(server_address);
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9000);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind (server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
    int client_socket;
    listen(server_socket, 3);
    client_socket=accept(server_socket, NULL, (socklen_t*)&addrlen);
    char response[256];

    recv(server_socket, &response, sizeof(response), 0);

    printf("%s",response);
    pclose (server_socket);
    return (0);
}

, а это код клиента:

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

int main()
{ 
    int network_socket; 
    network_socket = socket(AF_INET,SOCK_STREAM, 0);

    struct sockaddr_in server_address; 
    server_address.sin_family = AF_INET; 
    server_address.sin_port = htons(9000); 
    server_address.sin_addr.s_addr = INADDR_ANY; 

    int connection_status = connect(network_socket, (struct sockaddr*)&server_address, sizeof(server_address));
    if (connection_status == -1) { printf("ERROR"); } 

    char maw[256] = "this is a message"; send(network_socket, maw, sizeof(maw), 0); close(server_address); 
    return(0); 

    pclose(network_socket); 
}

1 Ответ

2 голосов
/ 05 апреля 2020

Также существует ошибка в коде сервера.

Код сервера:

Если вы хотите получить сообщение от клиента, вы должны использовать client_socket в вашем коде в функции recv(). Не сам server_socket.

Код клиента:

Почему вы используете функцию pclose() для закрытия сокета? Это для труб и требует указатель FILE. Более того, функция никогда не вызывается (после оператора return).

Это должно работать (проверено на моей системе):

Сервер:

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

int main()
{
    int server_socket;
    server_socket = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_address;
    int addrlen = sizeof(server_address);
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9000);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind (server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
    int client_socket;
    listen(server_socket, 3);
    client_socket=accept(server_socket, NULL, (socklen_t*)&addrlen);
    char response[256];

    recv(client_socket, &response, sizeof(response), 0);

    printf("%s",response);
    shutdown (client_socket, SHUT_RDWR);
    close (client_socket);
    shutdown (server_socket, SHUT_RDWR);
    close (server_socket);
    return (0);
}

Клиент:

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

int main()
{ 
    int network_socket; 
    network_socket = socket(AF_INET,SOCK_STREAM, 0);

    struct sockaddr_in server_address; 
    server_address.sin_family = AF_INET; 
    server_address.sin_port = htons(9000); 
    server_address.sin_addr.s_addr = INADDR_ANY; 

    int connection_status = connect(network_socket, (struct sockaddr*)&server_address, sizeof(server_address));
    if (connection_status == -1) { printf("ERROR"); } 

    char maw[256] = "this is a message"; 
    send(network_socket, maw, sizeof(maw), 0);
    shutdown (network_socket, SHUT_RDWR);
    close(network_socket);
    return(0);
}

Для функции shutdown() см. ответ .

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