确定。所以我有一个简单的客户端程序通过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;
}
任何想法为什么它不起作用?我没有收到任何错误消息。
答案 0 :(得分:2)
这不是解决方案,但您的代码应该检查iRcvdbytes
错误,方法与发送代码检查sendto
的结果相同。
返回0意味着套接字正常关闭(如果面向连接 - 这里不适用),SOCKET_ERROR
表示错误(至少在WinSock2中)。
发送方的套接字需要使用IPPROTO_UDP
创建,而不是0.这肯定会导致您的失败。