如何在两个远程主机上运行UDP客户端和服务器(在C中)?

时间:2020-08-13 09:47:54

标签: c sockets udp client-server

我是套接字编程的新手。我为UDP Client和Server编写了代码,这些代码在我的计算机上可以正常工作。我想在两个不同的主机上运行这些程序,即我计算机上的服务器和我朋友计算机上的客户端。没有路由器怎么办?请说明是否为此目的对代码进行了任何特定的更改。

这是代码:

接收器

#include<stdio.h>

#include<stdlib.h>

#include<sys/socket.h>

#include<sys/types.h>

#include<netinet/in.h>

#include<netinet/ip.h>

#include<string.h>

#include<unistd.h>

int main() {
  int ret = socket(AF_INET, SOCK_DGRAM, 0);
  if (ret == -1) {
    printf("socket creation fails\n");
    exit(0);
  } else
    printf("socket creation succeeds\n");

  struct sockaddr_in sender;
  int port;
  printf("Enter port:");
  scanf("%d", & port);
  sender.sin_family = AF_INET;
  sender.sin_port = htons(port);
  sender.sin_addr.s_addr = INADDR_ANY;

  int ret1;
  ret1 = bind(ret, (struct sockaddr * ) & sender, sizeof(sender));

  if (ret1 == -1) {
    printf("socket binding fails\n");
    exit(0);
  }

  printf("socket binding succeeds\n");

  struct sockaddr_in receiver;
  char str[15], str2[15];
  int addrlen = sizeof(receiver);

  while (1) {
    int rec = recvfrom(ret, str, sizeof(str), 0, (struct sockaddr * ) & receiver, & addrlen);
    printf("Received:");
    str[rec] = '\0';
    if (strcmp(str, "exit") == 0)
      break;

    if (rec == -1) {
      printf("recvfrom fails\n");
      exit(0);
    }

    printf("%s\n", str);

    printf("Enter :");
    scanf("%s", str2);

    int recsend = sendto(ret, str2, strlen(str2), 0, (struct sockaddr * ) & receiver, sizeof(receiver));

    if (recsend == -1) {
      printf("sendto fails");
      exit(0);
    }

    if (strcmp(str2, "exit") == 0)
      break;
  }

  close(ret);
  return 0;
}

发件人

#include<stdio.h>

#include<stdlib.h>

#include<sys/socket.h>

#include<sys/types.h>

#include<netinet/in.h>

#include<netinet/ip.h>

#include<string.h>

#include<unistd.h>

int main() {
  int ret = socket(AF_INET, SOCK_DGRAM, 0);
  if (ret == -1) {
    printf("\nsocket creation fails");
    exit(0);
  } else
    printf("\nsocket creation succeeds");

  struct sockaddr_in receiver;
  int port;
  printf("\nEnter port:");
  scanf("%d", & port);
  receiver.sin_family = AF_INET;
  receiver.sin_port = htons(port);
  receiver.sin_addr.s_addr = INADDR_ANY;
  char str[15], str2[15];

  int addrlen1 = sizeof(receiver);
  struct sockaddr_in sender;
  int addrlen = sizeof(sender);
  while (1) {
    printf("Enter:");
    scanf("%s", str);

    int send = sendto(ret, str, strlen(str), 0, (struct sockaddr * ) & receiver, addrlen1);
    if (send == -1) {
      printf("sendto fails");
      exit(0);
    }

    if (strcmp(str, "exit") == 0)
      break;

    int senrec = recvfrom(ret, str2, sizeof(str2), 0, (struct sockaddr * ) & sender, & addrlen);
    printf("\n");
    printf("Received:");
    str2[senrec] = '\0';
    if (strcmp(str2, "exit") == 0)
      break;

    if (senrec == -1) {
      printf("recvfrom fails\n");
      exit(0);
    }

    printf("%s\n", str2);
  }
  close(ret);
  return 0;
}

1 个答案:

答案 0 :(得分:0)

将两者都连接到不同的网络并获取服务器的IP地址。

将客户的receiver IP和端口更改为:

receiver.sin_addr.s_addr = inet_addr("8.8.8.8"); // Ip address of your server.
receiver.sin_port=htons(port); // Whatever port your server is listening to