C ++中的简单客户端服务器程序不起作用

simple client sever program in c++ not working

本文关键字:服务器 程序 不起作用 客户端 简单      更新时间:2023-10-16

我正在尝试用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;
}

我将不胜感激任何帮助。

您缺少所有错误处理。当出现问题时,您不知道为什么或如何解决它。始终检查错误情况。

这种特殊情况下,问题似乎出在服务器中的accept调用上:您将套接字长度作为最后一个参数传递,而您应该传递指向套接字长度的指针。此外,套接字长度最初设置为int的大小。代码应为:

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

一个更微妙的错误是服务器关闭套接字,不保证是否实际发送了任何数据。 不过,解决此问题更为复杂。