我正在编写Socket的客户端。当有东西要读时我的代码工作正常但是当没有东西要读时,recv永远不会返回。请帮助。
代码:
m_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in dest;
if ( m_socket )
{
memset(&dest, 0, sizeof(dest)); /* zero the struct */
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(address); /* set destination IP number */
dest.sin_port = htons(port);
if (connect(m_socket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
return false;
}
else
{
std::vector<char> inStartup1(2);
int recvReturn = recv(Socket, &inStartup1.at(0), inStartup1.size(), 0);
}
答案 0 :(得分:3)
recv是一个阻止通话。这可以帮到你: -
recv()调用通常仅用于连接的套接字。它会在成功完成时返回消息的长度。如果消息太长而无法容纳在提供的缓冲区中,则可能会丢弃多余的字节。取决于接收消息的套接字类型。
如果套接字上没有消息可用,则接收调用等待消息到达,除非套接字是非阻塞的,在这种情况下返回值-1,外部变量errno设置为EAGAIN或EWOULDBLOCK。接收电话通常会返回任何可用的数据,直至请求的金额,而不是等待收到所要求的全部金额。
答案 1 :(得分:0)
更进一步,在服务器上这是你如何正确处理连接(套接字或串口无关紧要):
while中的条件是唯一需要解决的问题 - 您要么知道预期消息的长度,要么使用一些分隔符来标记消息的结尾。
希望这有帮助!