udp简单通信

//客户端
#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;
}

上述例子在内网之间通信是可以的,但是内网和外网之间的通信是不正常的,因为外网无法正确找到内网的主机。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值