//客户端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ctype.h>
#define SERV_PORT 8000
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
int sockfd, n;
char buf[BUFSIZ];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "47.104.75.251", &servaddr.sin_addr.s_addr);
servaddr.sin_port = htons(SERV_PORT);
while (fgets(buf, BUFSIZ, stdin) != NULL) {
n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (n == -1)
perror("sendto error");
n = recvfrom(sockfd, buf, BUFSIZ, 0, NULL, 0); //NULL:不关心对端信息
if (n == -1)
perror("recvfrom error");
write(STDOUT_FILENO, buf, n);
}
close(sockfd);
return 0;
}
/**
如何实现内网和外网的通信
*/
/*//
// main.c
// udpserver
//
// Created by 吴珝君 on 2019/5/19.
// Copyright © 2019年 闲着也是贤者. All rights reserved.
//
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ctype.h>
#define SERV_PORT 8000
int main(int argc, const char * argv[]) {
printf("Hello, World!\n");
/*
1、建立套接字
2、初始化服务器地址结构体
3、服务器地址和套接字绑定
4、循环等待客户端消息的到来,并对数据进行处理
5、将数据发送给客户端
*/
struct sockaddr_in serv_addr, cli_addr;
socklen_t client_addr_len;
int sockfd;
char buf[BUFSIZ];
char str[INET_ADDRSTRLEN];
int i =0, n =0;
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_PORT);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sockfd, (struct sockaddr *)(&serv_addr), sizeof(serv_addr));
printf("等待客户端的连接。。。。。。\n");
while (1)
{
client_addr_len = sizeof(client_addr_len);
n = recvfrom(sockfd, buf, BUFSIZ, 0, (struct sockaddr *)(&cli_addr), &client_addr_len);
if (n == -1)
{
perror("recvform error....\n");
}
printf("receive from %s at port %d ...\n", inet_ntop(AF_INET, &cli_addr.sin_addr.s_addr,
str, sizeof(str)),
ntohs(cli_addr.sin_port));
for (int i = 0; i < n; i++)
{
buf[i] = toupper(buf[i]);
}
n = sendto(sockfd, buf, n, 0, ( struct sockaddr *)(&cli_addr), sizeof(cli_addr));
if (n == -1)
{
perror("sendto error...\n");
}
}
return 0;
}
上述例子在内网之间通信是可以的,但是内网和外网之间的通信是不正常的,因为外网无法正确找到内网的主机。