可以發送和接收TCP消息的服務器。
可以發送和接收UDP消息。
多個客戶端
- 可以發送和接收TCP消息
- 可以發送和接收UDP消息。
我使用基本套接字和select
爲我的服務器和網絡SFML模塊爲客戶端(http://www.sfml-dev.org/tutorials/2.4/network-socket.php)。
在服務器端創建我的插座,TCP和UDP端口4005
綁定在客戶端我用的是connect(host, ip)
呼籲TCP,和我的UDP端口綁定到4006,我的UDP端口已經綁定到服務器端的4005。
目前,我的TCP工作正常,我可以在雙方(客戶端和服務器)發送一個接收消息。
我想從服務器發送UDP數據包到客戶端。爲此,我正在從我接受的客戶端套接字sockaddr_in發送一條消息(sockaddr_in由accept
函數填充)。
但是,當我發送它,我的客戶端不會收到它。
我把這種方式:
unsigned int UDPSocket::send(Message &buffer, sockaddr_in const &addr)
{
sockaddr_in cpy;
std::memcpy(&cpy, &addr, sizeof(sockaddr_in));
//return ::send(_sock, buffer.getData().data(), buffer.getData().size(), 0);
std::cout << "sending to " << buffer.getClientId() << std::endl;
int fromsize = sizeof(sockaddr_in);
cpy.sin_port = htons(4005 +1);
std::cout << "sending to " << 4005 + 1 << std::endl;
int ret = ::sendto(_sock, buffer.getMessage(), buffer.getSize(), 0, (struct sockaddr *) &cpy, fromsize);
perror("sendto");
std::cout << ret << std::endl;
return ret;
}
RET優於0和perror
返回成功,所以應該將消息sended。
我收到這樣說:
bool Network::updateQueueUDP()
{
unsigned char data[sizeof(Protocol::rtypePacket)];
bool ret = false;
std::size_t received;
sf::IpAddress sender;
unsigned short senderPort;
if (_udpSocket.receive(data, sizeof(data), received, sender, senderPort) == sf::Socket::Done)
{
Message *msg = new Message();
msg->setMessage(data, received, 0);
_udpQueue.push(msg);
std::cout << "pushing" << std::endl;
ret = true;
}
return ret;
}
但receive
永遠不會返回sf::Socket::Done
你有一個想法,爲什麼我沒有在我的客戶的UDP得到了什麼?
我在哪裏可以找到'_udpSocket.receive'的代碼或規範?我懷疑你只是不明白它是如何工作的,它可能不是用於從UDP接收的正確函數,或者'sf :: Socket :: Done'可能不是正確的返回值來檢查。 – Omnifarious
@Omnifarious在此頁面上http://www.sfml-dev.org/tutorials/2.4/network-socket.php –
嗯,嗯......你得到什麼樣的回報值? – Omnifarious