【Linux】socket套接字编程 UDP

news/2024/5/18 13:38:26 标签: udp, linux, 网络

UDP示意图

1.在一个网络系统中要找到一个应用程序需要注意:

  • ①IP地址:通过ifconfig 可知道当前使用的网络IP地址,也就是将要监听的地址

  • ②端口号:netstat -nap | grep 8080  //查看8080端口的使用情况,防止有时候绑定失败如果查看到此端口被别的应用程序占用,即可更换端口号

2.所以在一个网络中的两部分要互相通信;需要分情况考虑,①如果在同一个系统中,那么只需要区分客户端服务端。 ②如果在两个系统中:则两端都需要创建客户端和服务端。。

3.服务端

fd = socket(AF_INET, SOCK_DGRAM, 0);

SOCK_DGRAM,0  表示使用SOCK——DGRAM的默认UDP     AF_INET表示因特网   

addrSer.sin_family = AF_INET;
addrSer.sin_addr.s_addr = inet_addr(SEVER_IP);
addrSer.sin_port = htons(SEVER_PORT);
ret = bind(fd, (struct sockaddr*)(&addrSer), addrlen); //监听程序所运行系统(Server_IP)的端口(SEVER_PORT)

代表监听SEVER_IP地址的SEVER_PORT端口。SEVER_PORT是接收数据的端口,不是发送端口。

fd表示创建的socket的返回值。

struct sockaddr src_addr;
socklen_t addrlen = sizeof(struct sockaddr);
char msg_buf[MAX_MSG_SIZE];
recv_size = recvfrom(fd, msg_buf, MAX_MSG_SIZE, 0, &src_addr, &addrlen);

阻塞监听fd(socket的返回值),存入msg_buf数组,最多一次收MAX_MSG_SIZE个数据。

4.客户端

    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(CLIENT_PORT);
    addrSer.sin_addr.s_addr = inet_addr(CLIENT_IP);
    char out_buf[] = "helloworld";
    int ret = sendto(fd, out_buf, sizeof(out_buf), 0, (struct sockaddr*)&(addrSer),
                 sizeof(struct sockaddr));

sendto()函数:通过创建的socket返回的fd,把传入的数组out_buf传到目的地址(CLIENT_IP)的端口(CLIENT_PORT),这个发送目的地的地址和端口。

代码:https://github.com/zion6135/CPP-study/tree/main/3.socket-udp


http://www.niftyadmin.cn/n/1786003.html

相关文章

【数据结构】八大排序之直接插入排序

一.直接插入排序 直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表 1.直接插入排序的基本思想: 以数组int arr…

【C++】虚函数与纯虚函数

参考《C/C程序员面试宝典》 虚函数与纯虚函数 虚函数的主要作用是建立抽象模型,从而可以达到方便扩展系统的目的。 纯虚函数是指被标明为不具体实现的虚函数,是一种特殊的虚函数。 两者的区别 虚函数必须是基类的非静态成员函数,其访问权…

【Linux】socket套接字编程 TCP(2)

调试经验: 1.接收一包数据,客户端与服务端需要注意用同一个结构体去存收到的变量。。比如规定通信双方的数据如下面的结构: struct body {uint32 length;char buffer[1024]; }__attribute((packed)); //不考虑字节对齐body_t; struct body b…

C语言中指针与数组的区别与联系

好久不写东西了,从毕业以来,整个人都懒散了很多。今天终于鼓起勇气,来写一点儿东西…… 指针与数组对于C语言程序员来说肯定不会陌生,一说起这个话题,我就想起了曾经被内存、地址、地址里的内容这些概念狂虐时的情形。…

jz2440:第二个驱动程序,按键驱动(5)

万事开头难,有了上一篇LED的基础,这次就可以仿照LED的驱动来实现按键驱动。。。可以说是一模一样。。所以写的很简单,有需要可理解上一篇,在来参照代码理解。 【本文默认使用交叉编译:arm-linux-gcc-3.4.5-glibc-2.3.…

【C++】array和vector,数组三者区别和联系

共同点 (1.)都和数组相似,都可以使用标准数组的表示方法来访问每个元素(array和vector都对下标运算符[ ]进行了重载) (2.)三者的存储都是连续的,可以进行随机访问 不同点 &#x…

jz2440:第三个驱动程序,按键中断(6)

中断流程分析 __irq_svc:执行irq_handler获取中断源跳转到asm_do_IRQ,执行中断处理逻辑__irq_svc: //1.中断统一入口函数 svc_entry //保存现场 #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #en…

【Linux】UDP与TCP的对比并写出TCP和UDP的服务端

UDP (1.)无连接 UDP在传输数据的时候不需要建立连接,可以直接传输。(这一点在UDP服务端程序中可以看到),因此传输速度比较快,适用于传视频,音频。 (2.)传输…