linux下c语言udp连接实例

5 篇文章 1 订阅
3 篇文章 0 订阅
//
// Created by 冰糖葫芦的夏天 on 16-7-15.
// server_udp.c
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <memory.h>

#define LISTENPORT 12345                                          //定义监听端口号
#define LISTENIP "127.0.0.1"                                          //定义监听IP地址
int main()
{
    int mysock, len, addr_client_len;
    struct sockaddr_in addr_server;                                   //定义一个服务端的结构体
    struct sockaddr_in addr_client;                                   //定义一个客户端的结构体
    char msg[256];                                                    //存储传输的数据

    mysock = socket(AF_INET, SOCK_DGRAM, 0);                          //建立套接字
    if (mysock != -1) {
        printf("[+] 建立套接字成功\n");
    }
    printf("[+] UDP监听端口: %d\n", LISTENPORT);
    printf("[+] UDP监听IP: %s\n", LISTENIP);
    memset(&addr_server, 0, sizeof(addr_server));                     //清空服务端套接字
    memset(&addr_client, 0, sizeof(addr_client));                     //清空客户端套接字
    addr_server.sin_family = AF_INET;                                 //设置地址类型
    addr_server.sin_port = htons(LISTENPORT);                         //设置服务端监听端口
    addr_server.sin_addr.s_addr = inet_addr(LISTENIP);                //设置服务端监听ip地址
    addr_client_len = sizeof(addr_client);                            //计算客户端结构体大小
    if (0 == bind(mysock, (const struct sockaddr *) &addr_server, sizeof(addr_server))) {   
                                                                      //绑定端口
        printf("[+] 监听端口绑定成功\n");
    }
    else {
        perror("[+] binderror");                                      //绑定错误处理
        return 0;
    }

    while (1){                                                        //循环接受客户端发来的信息
        memset(msg, 0, sizeof(msg));                                  //清空保存信息的内存
        len = (int) recvfrom(mysock, msg, sizeof(msg), 0, (struct sockaddr *) &addr_client, (socklen_t *) &addr_client_len);                                      //接受信息
        if (len == -1) perror("[+] recverror");                   //接受错误处理
        printf("[%d]%s: %s\n", len, inet_ntoa(addr_client.sin_addr), msg);   
                                                                      //打印接收到的信息
    }

    return 0;

}

------------------------我是分割线--------------------------
//
// Created by 冰糖葫芦的夏天 on 16-7-15.
//client_udp.c
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <memory.h>

#define REMOTEIP "127.0.0.1"                                        //要发送的ip地址
#define REMOTEPORT 12345                                            //要发送的端口
int main()
{
    int mysock, len;
    char msg[256];                                                  //定义一个存储发送消息的内存
    struct sockaddr_in addr;                                        //定义存储端口,ip信息结构体
    memset(&addr, 0, sizeof(&addr));                                //清空这个结构体
    mysock = socket(AF_INET, SOCK_DGRAM, 0);                        //建立套接字
    if (mysock != -1) {
        printf("[+] 建立套接字成功\n");
        printf("[+] 套接字ID: %d\n", mysock);
        printf("[+] 远程主机IP: %s\n", REMOTEIP);
        printf("[+] 远程主机端口: %d\n", REMOTEPORT);
    }
    addr.sin_family = AF_INET;                                      //结构体中填入地址类型
    addr.sin_port = htons(REMOTEPORT);                              //结构体中填入要发送到的端口
    addr.sin_addr.s_addr = inet_addr(REMOTEIP);                     //结构体中填入要发送到ip地址
    while (1) {
        memset(msg, 0, sizeof(msg));                                //清空消息内存
        printf("请输入: ");
        scanf("%s", msg);                                           //等待用户输入要发送的信息
        len = (int) sendto(mysock, msg, sizeof(msg), 0, (const struct sockaddr *) &addr, sizeof(addr));                                                      //发送消息
        if (len != -1) printf("[+] 消息发送成功\n"); 
        else {
            printf("[+] 发送失败\n");
            return 0;
        }
    }

    return 0;

}

/*
注:在recvfrom函数中
int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,int *fromlen)
s:          建立的socket编号
buf:        接收到的信息存储在哪块内存里
len:        存储接收信息的内存的大小,通过sizeof()获取
flags:      一般设置为0,可选参数为:       MSG_OOB:        传出的数据以out-of-band送出
                                        MSG_DONTROUTE:  取消路由表查询
                                        MSG_DONTWAIT:   设置为不可阻断
                                        MSG_NOSIGNAL:   此传输不愿被SIGPIPE信号中断
sockaddr:   存储数据(来源)的结构体,数据存储方式和sockaddr_in一样,具体自行百度
fromlen:    上面这个结构体的大小,通过sizeof获取,注意:sizeof获取到的是int,需要先赋一个变量,然后对这个变量取地址

注意:这里是数据(来源)的结构体,要定义两个结构体的,否则填错结构体,将出现bad address错误
     也可以在recvfrom函数的sockaddr里填NULL,此时第5个参数将被忽略,不会出现bad address错误,但是,将无法显示数据来源地址与端口

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值