所以我正在编写一个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,我从另一个窗口成功连接。任何想法可能是什么问题?
答案 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()
参数
编辑:(添加了释放,如建议的那样)