C ++ int的价值神秘变化

时间:2013-10-11 23:29:16

标签: c++ macos sockets

所以我正在编写一个c ++类来使c中的unix套接字更容易。但是,每次运行它都无法连接。端口的值在程序中途发生变化。 这是带有类的头文件:

#ifndef __Sockets__CHSocket__
#define __Sockets__CHSocket__
class Sock {
    int port;
    char host[16];
    int sock,maxLen;
    int bytes;
    long nHostAddress;
    struct hostent* pHostInfo;
    struct sockaddr_in dest;

public:
    Sock(int dom, int type);
    int connct(const char *host, int port);
    int bnd(const char *addr, int port);
    int lstn(int port);
    int snd(const char *toSend);
    int sndto(const char *msg, const char *dst);
    char* recv(int length);
    int accpt(int s, struct sockaddr *addr, socklen_t *addrlen);
    int clse();
};  
#endif /* defined(__Sockets__CHSocket__) */

这是CHSocket.cpp(缩写为实际运行的内容):

// Constructor definition
Sock::Sock(int dom, int type)
{
    bzero(&dest, sizeof(dest));
    if ((sock=socket(dom, type, 0)<0)) {
        cerr << "[!] Failed to create socket!;";
    }
    dest.sin_family=dom;
    memset(&dest, 0, sizeof(dest));
}

// Connect definition
int Sock::connct(const char *host, int port)
{
    char theHost[sizeof(host)];
    strcpy(theHost, host);
    pHostInfo=gethostbyname(theHost);
    memcpy(&nHostAddress,pHostInfo->h_addr,pHostInfo->h_length);

    dest.sin_addr.s_addr=nHostAddress;
    dest.sin_port = htons(port);
    if (connect(sock, (struct sockaddr *)&dest, sizeof(dest)) < 0)
    {
        cerr << "[!] Failed to connect socket!";
        return -1;
    }
    else
    {
        return 0;
    }
    return 0;
}

这是main.cpp:

int main()
{
    Sock test = Sock(AF_INET, SOCK_STREAM);
    test.connct("127.0.0.1", 3000);
    test.clse();
}

我在osx 10.8上使用xcode 5。当我运行该程序时,它告诉我它无法连接。我在connect函数的最开头和定义pHostInfo的行中放入了一些断点。 在第一个断点处,端口值为3000,第二个断点为49.这是否与连接问题有关?

更新:

该程序现在运行,但它给我以下输出:

[!] Failed to connect socket!Program ended with exit code: 0

这是它无法连接套接字时的作用。我有netcat监听端口3000,我从另一个窗口成功连接。任何想法可能是什么问题?

2 个答案:

答案 0 :(得分:3)

char theHost[sizeof(host)];

为您提供一个包含sizeof(char*)空间的数组。实际上你需要strlen(host)+1个字节,因此可能会在后续的strcpy中覆盖内存。改变这种情况需要支持VLA(不作为标准存在)或不必要的动态分配。

在其位置使用theHost删除host会更容易。

答案 1 :(得分:3)

char theHost[sizeof(host)];

该行分配足够的字节来存储host的大小,这是一个指向char的指针,它可能是8.然后它会覆盖端口号,因为你没有分配足够的内存。堆。您可能需要以下内容:

char *theHost = new char[strlen(host)+1]

然后在构造函数返回之前释放内存:

delete [] theHost;

或者,更简单,更好,您可以直接在调用host

时使用gethostbyname()参数

编辑:(添加了释放,如建议的那样)