2015-12-21 54 views
0

当我使用套接字时,程序服务器进程没有收到来自客户端进程/类的任何消息。 给用户的输入端口是5555,但是当程序退出客户端的构造函数时,sin的端口号不匹配(我认为这是因为htons),同样也是ip地址。 请帮我解决这个问题。我的程序不发送消息或没有收到套接字,ip是127.0.0.1

这是我的服务器代码:

#include "SocketUDP.h" 
/* 
* class constructor 
*/ 
SocketUDP::SocketUDP() { 
    sock = socket(AF_INET, SOCK_DGRAM, 0); 

    if (sock < 0) 
     perror("error creating socket"); 
} 

/* 
* class destructor 
*/ 
SocketUDP::~SocketUDP() { 
    close(sock); 
} 

/* 
* this function recieves a message from client/server 
* @param - the length of the message 
*/ 
std::string SocketUDP::RecieveMessage(){ 
    unsigned int from_len = sizeof(struct sockaddr_in); 
    char buffer[4096]; 
    memset(&buffer, 0, sizeof(buffer)); 
    int bytes = recvfrom(sock, buffer, sizeof(buffer), 0, 
     (struct sockaddr *) &from, &from_len); 

    if (bytes < 0) 
     perror("error reading from socket"); 

    return std::string(buffer); 
} 

这是客户:

#include "UDPClient.h" 

    /* 
    * class constructor 
    */ 
    UDPClient::UDPClient(char * ip, int port) { 
     memset(&sin, 0, sizeof(sin)); 
     sin.sin_addr.s_addr = inet_addr(ip); 
     sin.sin_family = AF_INET; 
     sin.sin_port = htons(port); 
    } 

/* 
* class destructor 
*/ 
UDPClient::~UDPClient() { 
    // TODO Auto-generated destructor stub 
} 

/* 
* this function sends a message to the client/server 
* @param - the message 
    */ 
    int UDPClient::SendMessage(std::string st){ 
     int sent_bytes = sendto(sock, st.c_str(), st.length(), 0, 
      (struct sockaddr *) &sin, sizeof(sin)); 
     if (sent_bytes < 0) 
      perror("error writing to socket"); 

     return sent_bytes; 
    } 
+0

您的问题描述是模糊和混乱。请尽可能清楚地说明您得到的结果以及您期望的结果。 –

+0

[请阅读'bind'](https://www.freebsd.org/cgi/man.cgi?query=bind&sektion=2)。 – user4581301

+0

@ user4581301 UDP没有'listen'。 –

回答

2

你缺少在服务器bind()通话。这是您告诉操作系统端口(5555)应监听传入UDP数据包的位置。

如果您在服务器中忽略bind(),这是相当混乱的。在这种情况下,操作系统会选择一个随机端口来接收,这通常不是您想要的。

类名UDPSocket表明这只是一个UDP套接字而不是服务器的包装。此外,服务器还会有一个bind()调用,以及处理请求的无限循环。也许你遗漏了服务器代码?

相关问题