我只是在学习UDP套接字,这是我的第一个涉及它的代码。我有两个程序来回发送和接收消息。我的问题是,似乎我必须在整个代码中多次声明要发送/接收的IP地址,但是我觉得有一种更好的方法,而无需在代码中手动更改inet_addr。从我的阅读看来,sendto和recvfrom也许可以提供帮助,但是我不确定如何在这种情况下使用它们。如果有人能告诉我如何解决我的简单问题,我将不胜感激!谢谢

代码1:发送然后接收

int main(int argc, char *argv[])
{
//initialize socket and structure
int socket_info;
struct sockaddr_in server;
char message[100];
char incoming_message[100];

printf("Input Message: ");
fgets(message, 100, stdin);

    //create socket
    socket_info = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_info == -1) {
    printf("Could not create socket");
    }

//assign local values
    server.sin_addr.s_addr = inet_addr("172.21.8.178");
    server.sin_family = AF_INET;
    server.sin_port = htons( 1100 );

    //binds connection
    if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connection error");
       return 1;
    }
    puts("Bind");

    //assign new value to connect to
    server.sin_addr.s_addr = inet_addr("172.21.8.179");

    //checks connection
    if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) <       0) {
    perror("Connection error");
       return 1;
    }
    puts("Connected");

    //sends message
if(send(socket_info, message, strlen(message), 0) <0) {
perror("Send failed");
    return 1;
    }
    puts("Message Sent");

//receives message back
if(recv(socket_info, incoming_message, sizeof(incoming_message), 0) <0) {
puts("Received failed");
    return 1;
    }
    puts("Message received");
    puts(incoming_message);

close(socket_info);

}

代码2:先接收再发送
int main(int argc, char *argv[])
{
//initialize socket and structure
int socket_info;
struct sockaddr_in server;
char incoming_message[100];

    //create socket
    socket_info = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_info == -1) {
    printf("Could not create socket");
    }

    //assign values
    server.sin_addr.s_addr = inet_addr("172.21.8.179");
    server.sin_family = AF_INET;
    server.sin_port = htons( 1100 );

    //checks connection
    if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
    perror("Connection error");
       return 1;
    }
    puts("Bind");

    //Receive an incoming message
if( recv(socket_info, incoming_message, sizeof(incoming_message), 0) < 0) {
puts("Received failed");
    return 1;
    }
    puts("Message received");
    puts(incoming_message);

server.sin_addr.s_addr = inet_addr("172.21.8.178");

if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
    perror("Connection error");
     return 1;
    }
    puts("Connected");

//Sends message back
char message[100];

printf("Input Message: ");
fgets(message, 100, stdin);

if(send(socket_info, message, strlen(message), 0) <0) {
perror("Send failed");
    return 1;
    }
    puts("Message Sent");

close(socket_info);
}

最佳答案

如果使用函数recvfrom()

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
             struct sockaddr *src_addr, socklen_t *addrlen);

该功能的作用是用刚刚接收到的数据包的IP和端口信息填充sockaddr的结构。例如,如果先发送然后接收的代码向接收方发送了一个数据包,则接收方应该能够用正确的值填充sin_addr和sin_port的结构值。然后,您可以使用此信息调用sendto(),以便将其发送到正确的计算机。

以下是这些功能的手册页:

https://linux.die.net/man/2/recvfrom

https://linux.die.net/man/2/sendto

关于c++ - 简单的UDP套接字代码,发送和接收消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31955514/

10-16 07:17