拜托,这是我第一次尝试使用套接字进行编程。我使用C ++ MFC,我试图使应用程序通过其TCP / IP地址与视频服务器控制器通信。
我毫无错误地完成了所有的第一步。我创建了一个套接字,我调用bind()
函数来关联地址,但是当我尝试连接时它不起作用。
我不知道我做错了什么,所以我把部分代码放在了下面。
struct sockaddr_in my_addr;
int lenAddrs;
b1 = 192;
b2 = 168;
b3 = 11;
b4 = 2;
remoteAddress.Format("%u.%u.%u.%u", b1, b2, b3, b4);
port = (u_short)(portNumber);
// my address
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
lenAddrs = sizeof(my_addr);
// remote address
memset(&remote_addr, 0, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = port;
inet_pton(AF_INET, remoteAddress, (&remote_addr.sin_addr));
// socket
sckSloMo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sckSloMo == INVALID_SOCKET)
{
AfxMessageBox("sckSloMo is invalid!!");
return;
}
if (sckSloMo != SOCKET_ERROR)
{
ret = bind(sckSloMo, (const sockaddr*) &my_addr, sizeof(my_addr));
if (ret == 0)
{
ret = connect(sckSloMo, (const sockaddr*) &remote_addr, sizeof(remote_addr));
if (ret == 0)
{
AfxMessageBox("connect!");
StartSendingMessages();
}
else
{
AfxMessageBox("connect error!!!");
return;
}
}
}
如果有人能帮助我,我会很高兴。
答案 0 :(得分:1)
试试这个:
struct sockaddr_in remote_addr;
int lenAddrs;
b1 = 192;
b2 = 168;
b3 = 11;
b4 = 2;
remoteAddress.Format("%u.%u.%u.%u", b1, b2, b3, b4);
port = (u_short)(portNumber);
// remote address
memset(&remote_addr, 0, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(port);
inet_pton(AF_INET, remoteAddress, (&remote_addr.sin_addr));
// socket
sckSloMo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sckSloMo == INVALID_SOCKET)
{
AfxMessageBox("sckSloMo is invalid!!");
return;
}
if (sckSloMo != SOCKET_ERROR)
{
ret = connect(sckSloMo, (const sockaddr*) &remote_addr, sizeof(remote_addr));
if (ret == 0)
{
AfxMessageBox("connect!");
StartSendingMessages();
}
else
{
AfxMessageBox("connect error!!!");
return;
}
}
正如其他人已经正确指出的那样,端口的值不是正确的字节顺序。此外,您不需要在客户端套接字上使用bind()
。 MSDN docuemntation for connect()
有一个非常直接且容易理解的例子。
答案 1 :(得分:0)
你正在混淆。您需要bind()
作为传入套接字,而不是传出套接字。您需要连接传出套接字,而不是传入套接字。所以请仅使用connect,而不是bind()
。
您尚未初始化remote_addr.sin_addr
。这不行。如果你没有明确地初始化它,那么你的memset(,0)仍然是 0.0.0.0 。虽然 0.0.0.0 非常适合绑定(意味着绑定到所有网卡),但它不是连接的有效目标地址。
设置remote_addr.sin_addr
的示例代码:
remote_addr.sin_addr = inet_addr("192.168.11.2");
此外,将port
放入sockaddr_in
时,请不要忘记按正确的字节顺序排列。根据{{1}}的值,您可能需要将代码更改为:
port