простая клиентская программа на с ++ не работает

0

Я пытаюсь создать простую клиентскую серверную программу в c++. Сервер и клиент выполняются до завершения, но данные не передаются с сервера на клиент. Мой код сервера:

#include <stdio.h>
#include <stdlib.h>

#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>

int main(void) {



    int sid=socket(AF_INET,SOCK_STREAM,0); 

    int  clilen;

    int clisocket;

    char buffer[256];

    int portnumber=atoi("8888");

    struct sockaddr_in serverinfo,cliinfo;
    memset(&serverinfo, '0', sizeof(serverinfo));
    memset(&cliinfo, '0', sizeof(cliinfo));

    serverinfo.sin_family=AF_INET;
    serverinfo.sin_port=htons(portnumber);
    serverinfo.sin_addr.s_addr=INADDR_ANY;


    bind(sid,(struct sockaddr *)&serverinfo,sizeof(serverinfo));

    listen(sid,1000);


    clilen=sizeof(clilen);


    clisocket=accept(sid,(struct sockaddr*)&cliinfo,(socklen_t*)clilen);

    bzero(buffer,256);


    printf("before server \n");
    write(clisocket,"hello",5);
    printf("after server \n");


    close(clisocket);

    close(sid);

    return 0;
}

и мой клиентский код:

#include <stdio.h>
#include <stdlib.h>


#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>

int main(void) {

    char buffer[256];
    bzero(buffer,256);

    int cid=socket(AF_INET,SOCK_STREAM,0);

    int port=atoi("8888");

    struct sockaddr_in serverinfo;

    memset(&serverinfo, '0', sizeof(serverinfo));

    struct hostent* host;

    memset(&host, '0', sizeof(host));

    host=gethostbyname("localhost");

    serverinfo.sin_family=host->h_addrtype;
    memcpy((char *) &serverinfo.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
    serverinfo.sin_port=htons(port);


    int statusconnect=connect(cid,(sockaddr*)&serverinfo,sizeof(serverinfo));


    printf("before read client \n");
    read(cid,buffer,255);
    printf("after client read");
    printf(buffer); //not print this!!!

    printf(buffer);
    close(cid);

    return 0;
}

Я был бы признателен за любую помощь.

Теги:
sockets
gcc

1 ответ

3
Лучший ответ

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

В этом конкретном случае проблема заключается в вызове accept на сервере: вы передаете длину сокета в качестве последнего параметра, когда вы должны передать указатель на длину сокета. Кроме того, длина сокета устанавливается вначале на размер int. Код должен быть:

clilen = sizeof(struct sockaddr_in);
clisocket = accept(sid,(struct sockaddr*)&cliinfo,(socklen_t*)&clilen);

Более тонкая ошибка заключается в том, что сервер закрывает сокет без каких-либо гарантий того, была ли отправлена какая-либо информация. Однако исправление этого сложнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню