当boost :: asio实现一个简单的udp客户端服务器时,我遇到了一个问题: :ip :: udp.if我使用ipv6链接范围单播地址绑定服务器,它可以在某些PC上运行,但不能在某些其他PC上运行。在ipv6链接范围中应用boost :: asio :: ip :: udp unicast udp客户端服务器deamon,有时可以使用,但有时不会
//main.cpp
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <boost/asio.hpp>
#include <boost/format.hpp>
void test_udp_server(std::string const& host_, std::string const& port_)
{
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::resolver resolver(io_service);
boost::asio::ip::udp::endpoint endpoint= *resolver.resolve(boost::asio::ip::udp::resolver::query(host_, port_));
socket.open(endpoint.protocol());
std::cout << "address:" << endpoint.address().to_string() << " port:" << port_ << std::endl;
boost::system::error_code e;
socket.bind(endpoint, e);
if (e)
{
std::cerr << "bind error:" << e.message() << std::endl;
return;
}
//recieve from
boost::asio::ip::udp::endpoint remote_endpoint;
char buffer[4096];
unsigned int size;
while (1)
{
memset(buffer, 0, 4096);
size = 0;
size = socket.receive_from(boost::asio::buffer(buffer, 4096), remote_endpoint);
std::cout << "receive: " << std::string(buffer) << std::endl;
}
}
void test_udp_client(std::string const& host_, std::string const& port_)
{
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::resolver resolver(io_service);
boost::asio::ip::udp::endpoint dest_endpoint= *resolver.resolve(boost::asio::ip::udp::resolver::query(host_, port_));
socket.open(dest_endpoint.protocol());
int i = 0;
boost::system::error_code e;
while (i < 10)
{
std::string msg = boost::str(boost::format("udp message %d") % i);
socket.send_to(boost::asio::buffer(msg.c_str(), msg.size()), dest_endpoint, boost::asio::detail::message_do_not_route, e);
if (!e)
{
std::cout << "send: " << msg << std::endl;
}
else
{
std::cerr << "send error: " << e.message() << std::endl;
}
i ++;
}
}
int main(int ac, char* av[])
{
if (ac != 4)
{
std::cout << "ac != 4" << std::endl;
return -1;
}
if (std::string(av[1]) == "c")
{
test_udp_client(std::string(av[2]), std::string(av[3]));
}
else if (std::string(av[1]) == "s")
{
test_udp_server(std::string(av[2]), std::string(av[3]));
}
else
{
std::cout << "av[1] != \"c\" and av[1] != \"s\"" << std::endl;
return -1;
}
}
complite它,并运行,因为这:
./main s fe80::211:85ff:fe6c:44ac%eth0 100 #server, "s" means server,
#"fe80::211:85ff:fe6c:44ac%eth0" means your ipv6 address
#and 100 is port
./main c fe80::211:85ff:fe6c:44ac 100 #run it in another ssh or shell
但结果是:
- 1 UDP服务器从不接收客户端
[[email protected] Tmp2]# ls<br>
main main.cpp main.o Makefile<br>
[[email protected] Tmp2]# ./main s fe80::211:85ff:fe6c:44ac%eth0 100<br>
address:fe80::211:85ff:fe6c:44ac%eth0 port:100<br>
sended味精
2 udp客户端,已发送msg successf ULY
[[email protected] Tmp2]# ./main c fe80::211:85ff:fe6c:44ac 100<br>
send: udp message 0<br>
send: udp message 1<br>
send: udp message 2<br>
send: udp message 3<br>
send: udp message 4<br>
send: udp message 5<br>
send: udp message 6<br>
send: udp message 7<br>
send: udp message 8<br>
send: udp message 9<br>
3当我打开tcpdum,它真正抓住客户机
[[email protected] Tmp2]# tcpdump -i lo udp and host fe80::211:85ff:fe6c:44ac<br>
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode<br>
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes<br>
10:55:41.215110 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215295 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215360 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215431 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215516 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215585 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215790 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.215926 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.216069 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
10:55:41.216130 IP6 fe80::211:85ff:fe6c:44ac.59007 > fe80::211:85ff:fe6c:44ac.100: UDP, length 13<br>
4 sended味精,这是我的ifconfig:
[[email protected] Tmp2]# ifconfig<br>
eth0 Link encap:Ethernet HWaddr 00:11:85:6C:44:AC
inet addr:192.168.23.38 Bcast:192.168.23.255 Mask:255.255.255.0<br>
inet6 addr: fe80::211:85ff:fe6c:44ac/64 Scope:Link<br>
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br>
RX packets:1174940938 errors:0 dropped:0 overruns:0 frame:0<br>
TX packets:626463551 errors:0 dropped:0 overruns:0 carrier:0<br>
collisions:0 txqueuelen:100<br>
RX bytes:378565405153 (352.5 GiB) TX bytes:126427805747 (117.7 GiB)<br>
Base address:0x3400 Memory:fd000000-fd020000<br>
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0<br>
inet6 addr: ::1/128 Scope:Host<br>
inet6 addr: ::127.0.0.1/0 Scope:Compat<br>
UP LOOPBACK RUNNING MTU:16436 Metric:1<br>
RX packets:188781410 errors:0 dropped:0 overruns:0 frame:0<br>
TX packets:188781410 errors:0 dropped:0 overruns:0 carrier:0<br>
collisions:0 txqueuelen:0<br>
RX bytes:582726106596 (542.7 GiB) TX bytes:582726106596 (542.7 GiB)<br>
由在运行服务器和客户端之前,我已经停止了iptables。并且更奇怪,在我的另一台pc中它运行正常。
为什么?
如果试图只绑定到该端口,而不是主机,它更好的工作呢?即跳过所有解析和绑定,只需创建如下这样的套接字:'boost :: asio :: ip :: udp :: socket套接字(io_service,boost :: asio :: ip :: udp :: endpoint(udp :: v6 ),atoi(port_.c_str())));' – 2012-08-17 05:13:08
感谢Mr.Pileborg.As你的建议,它现在运行如此健康!但有一点遗憾,它不适合我的需要。事实上,我想分配为主机的每个接口指定num个线程来接收和处理消息,然后我必须将接口绑定到套接字。 – LinYihang 2012-08-17 07:23:41