草庐IT

c++ - 程序关闭后套接字保持打开状态(C++)

我目前正在编写一个小型服务器应用程序,我的问题是,当我关闭我的应用程序时(或者更好,按下eclipse中的终止按钮),套接字有时会保持打开状态,因此当我下次执行我的应用程序时次,bind()将失败并显示“地址已在使用中”。程序退出时如何正确关闭套接字?我已经放了close(mySocket);在类析构函数中,但这似乎并没有改变任何东西。 最佳答案 UseSO_REUSEADDR. 关于c++-程序关闭后套接字保持打开状态(C++),我们在StackOverflow上找到一个类似的问题:

c++ - 设置套接字超时?

使用套接字,我不确定如何设置超时?谢谢intsock,connected,bytes_recieved;charsend_data[128],recv_data[128];SOCKADDR_INserver_addr,client_addr;intsin_size;intj=0;::socket(AF_INET,SOCK_STREAM,0);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(4000);server_addr.sin_addr.s_addr=INADDR_ANY;::bind(sock,(structso

c++ - 从已经关闭的套接字接收数据?

假设我有一个服务器应用程序-使用UNIX套接字通过TCP连接。连接是异步的——换句话说,客户端和服务器的套接字是非阻塞的。假设以下情况:在某些情况下,服务器可能决定向已连接的客户端发送一些数据并立即关闭连接:使用shutdown和SHUT_RDWR。所以,我的问题是-是否可以保证,当客户端调用recv时,它会收到(由服务器发送的)数据?或者,要接收数据,必须在服务器关闭之前调用recv?如果是这样,我应该怎么做(或者更准确地说,我应该怎么做)以确保客户端接收到数据? 最佳答案 您可以使用“setsockopt(SO_LINGER)”

c++ - 使用 boost asio 原始套接字创建第 2 层/以太网套接字(在 C++ 中)

使用boost::asio库创建IP、TCP或UDP套接字相当容易。但是,当涉及到以太网套接字时,您需要实现boost/asio/basic_raw_socket.hpp由于Internet上没有此类示例,而且我花了很长时间才找到答案,所以我将解决方法放在这里。我找到的最有用的资源是:AF_NETLINK(netlink)socketsusingboost::asio 最佳答案 可以使用generic::raw_protocol东西打开原始套接字:std::stringifname("eth1");typedefboost::asi

c++ - 如何在 Solaris 上的 BSD 套接字上设置 TCP_NODELAY?

我正在尝试使用以下方法关闭BSD套接字的Nagle算法:setsockopt(newSock,IPPROTO_TCP,TCP_NODELAY,(char*)&flag,sizeofflag);但编译器声称TCP_NODELAY之前从未见过:error:`TCP_NODELAY'undeclared(firstusethisfunction)这是包含文件的完整列表:#include#include#include#include#include#include#includeusingnamespacestd;我还有-lnsl和-lsocket链接器选项,但它无法编译。我错过了什么吗?所

c++ - 使用 0MQ 通过 TCP 连接到第一个空闲端口

我正在编写一个分布式搜索算法,其中代理需要在TCP套接字上监听传入连接。在某些时候,代理应该绑定(bind)一个空闲的TCP端口。端口号并不重要,但代理应将他/她的监听端口号发送给其他代理。我想这是正确的做法:socket.bind("tcp://*:0");Socket绑定(bind)成功,但是我如何获取socket绑定(bind)的端口号?我在返回端口号的zmq_getsockopt手册页中看不到任何选项代码。 最佳答案 在Zeromq中,您可以使用字符串来绑定(bind)或连接。它以协议(protocol)开头,tcp://在

c++ - 如何区分 sys/sockets.h 中的 bind() 和 std::bind?

我正在使用g++4.6.0编译一些在早期版本中成功编译的C++代码。if(bind(iControl,(structsockaddr*)&sa,sizeof(sa))==-1)throwruntime_error("bind");其中iControl是套接字,sa是structsockaddr_in。但是,在g++4.6中我得到以下错误:comms.cpp:93:66:error:nomatchfor‘operator==’in‘std::bind(_Functor&&,_ArgTypes&&...)[with_Functor=int&,_ArgTypes={sockaddr*,lon

c++ - 停止阻塞在 recv() 上的接收器线程

我有一个聊天应用程序,它有一个单独的线程来监听传入的消息。while(mainthreadnotcallingforreceivertoquit){stringmessage=tcpCon.tcpReceive();//Reliesontherecv()functionprocessIncomingMessage(message);}这种工作方式有一个大问题。大多数时候,循环将阻塞在recv()上,因此接收线程不会退出。在几秒钟后不强制线程终止的情况下,解决此问题的正确方法是什么? 最佳答案 使用shutdown()关闭套接字,为所

c++ - 如何检查套接字是否在 Boost.Asio 中关闭?

检查远程连接端的套接字是否关闭的最简单方法是什么?socket::is_open()返回true,即使它在远程端关闭(我正在使用boost::asio::ip::tcp::socket).我可以尝试从流中读取并查看它是否成功,但我必须更改我的程序逻辑以使其以这种方式工作(我不希望此时从流中提取数据支票)。 最佳答案 只需在您的async_receive处理程序中检查boost::asio::error::eof错误。这意味着连接已关闭。这是唯一正确的方法。 关于c++-如何检查套接字是否

c++ - 在 C++ 中下载一个 URL

我希望能够用C++下载一个URL。像这样简单的东西:std::strings;s=download("http://www.example.com/myfile.html");理想情况下,这将包括如下URL:ftp://example.com/myfile.dat文件:///usr/home/myfile.dathttps://example.com/myfile.html我在Boost中使用asio,但它似乎并没有真正处理ftp和https等协议(protocol)的代码。现在我发现QT有更多我需要的东西(http://doc.trolltech.com/2.3/network.ht