【发布时间】:2010-12-04 19:57:01
【问题描述】:
好的。所以我有一个简单的客户端程序通过 UDP 将图像发送到指定的 IP 地址。在指定的 IP 处,服务器程序正在侦听并应接收图像。
当我在 localhost 上尝试这两个程序时(即它们都在 127.0.0.1 上运行)它可以工作并且服务器接收图像。当我尝试将客户端和服务器程序放在同一网络中的不同 PC 上时,它不起作用。
147.232.24.163是服务器IP,147.232.24.150是客户端IP。
这是我的客户程序:
// Initialize UDP.
struct sockaddr_in server;
int n_sent;
int socketId = socket(AF_INET, SOCK_DGRAM, 0);
if (socketId < 0)
{
cout << "Problem creating socket." << endl;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("147.232.24.163");
// Establish the server port number - we must use network byte order!
server.sin_port = htons(42001);
for ( int iter = 0; iter < 60; iter++ )
{
// load image into jpegBuf
n_sent = sendto(socketId, reinterpret_cast<char*> (&jpegBuf[0]), jpegBuf.size(), 0, (struct sockaddr*) &server, sizeof(server));
if (n_sent < 0) {
cout << "Problem sending data." << endl;
}
}
close(socketId);
这是我的服务器程序:
int main()
{
int bufferSize = 1024000;
int iSockFd = -1;
int iLength = 0;
struct sockaddr_in servAddr, cliAddr;
char buff[bufferSize];
iSockFd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset(&servAddr, 0, sizeof(servAddr));
memset(&cliAddr, 0, sizeof(cliAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("147.232.24.163");
servAddr.sin_port = htons(42001);
int cliAddrLen = sizeof(struct sockaddr_in);
int bindRet = bind(iSockFd, (struct sockaddr*)&servAddr, sizeof(servAddr));
cout << "Bind returned " << bindRet << endl;
int i = 0;
while (true)
{
int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0,
(struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen);
if (0 == i % 5)
{
cout << "Received " << iRcvdBytes << " bytes from the client" << endl;
}
i++;
}
close(iSockFd);
return 0;
}
任何想法为什么它不起作用?我没有收到任何错误消息。
【问题讨论】:
-
我已经简化了程序,所以只有与套接字相关的基本内容。我知道阅读很长的代码 sn-ps 很痛苦。
-
确保两台机器上的所有防火墙都被禁用...很多防火墙会过滤传入的UDP数据包。
-
@Jeremy Friesner 我确定了这一点。 100% 确定我已在两台 PC 上完全卸载了防火墙。
-
为什么只打印每五次迭代接收的字节数? (也许您只是很不走运 - 五分之四的消息成功,但每五分之一都失败了。)您是否在调试器中单步执行过?
-
@Ciaran Keating 好吧,因为图像应该非常快(每秒 25-30 个)所以我希望能够用我的眼睛看到发生了什么。