udp(无连接)客户端和服务端代码

B站就业班视频的代码搬运

55课最后部分

我正在自学C++  跟着这个视频,有同样自学的朋友私信 - -加个qq一起努力啊。

我的以后的努力方向:数据库或者音视频开发。。。 

以往的网络代码(tcp ),必须先开服务器端,

(服务器代码中,步骤如下:

socket 函数创建套接字描述符

bind绑定本地(本机当服务器了)上的IP地址和端口一个

listen改为监听模式

然后你去启动客户端文件,服务器端accept函数接受到新连接请求。

然后这篇代码你可以先启动客户端

我写的跟老师比较起来有一个尴尬的bug, 我读出来的n (字符数)都是我设置的缓冲区buf【256】 的长度 256

你也不用开启客户端,只开启服务端的程序后,你再另一个终端截面,用

nc  -u  127.0.0.1   8888 

这个命令就可以测试了

1.代码展示

//udp  man 7 udp 服务器端代码 
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>

int main() {
    int sfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sfd < 0){
	    perror("socket fun error \n");
        return -1;
    }
   
    //定义2个地址结gou体,一个是服务地址,一个是客户地址
    struct sockaddr_in servad;
    struct sockaddr_in clienad;
    socklen_t clienlen = sizeof(clienad);

    bzero(&servad, sizeof(servad));
    bzero(&servad, sizeof(clienad));

    servad.sin_family =AF_INET;
    servad.sin_port =htons(8888);
    servad.sin_addr.s_addr = htonl (INADDR_ANY);
 
    int ret = bind(sfd, (struct sockaddr*)&servad, sizeof( servad));
    char buf[256];
     
    while (1) {
        //读数据
        memset(buf,0x00,sizeof(buf));
        int n =recvfrom (sfd, buf, sizeof(buf),0, (struct sockaddr*)&clienad, &clienlen);
        if (n <=0){ 
             printf(" read error or client close ,n==[%d]\n", n); 
             break;
        }
        else {
            printf ("这里是服务器端n =%d ,读到的是%s \n", n,buf);
            //将小写字母都转化wie大写
            for (int j =0; j<n; j++) { 
                buf[j] =toupper (buf[j]); 
            }    // ctype.h头文件
            //发送数据
            sendto (sfd, buf, n,0,(struct sockaddr*)&clienad, clienlen);
        }
    }
    close(sfd);
return 0;
}

//udp   客户端代码 
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>

int main() {
    int sfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sfd < 0){
	perror("socket fun error \n");
    }
    //定义1个地址结gou体,是要发送的目的地,服务地址
    struct sockaddr_in servad;
    bzero(&servad, sizeof( servad));
    servad.sin_family =AF_INET;
    servad.sin_port =htons(8888);
    //这个服务器地址我们只是知道"127.0.0.1"或者一个字符串,转化为网络字节序列,用传入参数那种
//    int inet_aton(const char *cp, struct in_addr *inp);
    inet_aton("127.0.0.1", &(servad.sin_addr)); 
    int ret = bind(sfd, (struct sockaddr*)&servad, sizeof( servad));
    char buf[256];
    //ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
      //           struct sockaddr *src_addr, socklen_t *addrlen);
     
    while (1) {
        //客户端,要先发送据
        memset(buf,0x00,sizeof(buf));
        printf("哈哈哈,输入几个小写字母\n");
        int n = read(STDIN_FILENO, buf,sizeof(buf));
        sendto (sfd, buf, sizeof(buf),0,(struct sockaddr*)&servad, sizeof(servad));
        n =recvfrom (sfd, buf, sizeof(buf),0, NULL, NULL);
        if (n <=0){ 
             printf("这里是客户端,啥也没接受到,n==[%d]\n", n); 
             break;
        }
        else {
	    printf("这里是客户端,接受%s\n",buf);
	}
    }
    close(sfd);
return 0;
}

2. 相关函数简单介绍

2.1   recvfrom

ssize_t   recvfrom  (int sockfd,   void *buf,   size_t len,    int flags,
         struct sockaddr *src_addr,    socklen_t *addrlen);

用于向另一个套接字(描述符)发送信息。

参数1:  套接字

参数2 :你用来接收结果的字符串

参数3: 参数2的长度

参数4 :标志位,经常填写 0

参数5: 向你发送这个信息的来源地址。

参数6 :参数5的长度的取指针(取地址) 

 用这个函数,相当于tcp 代码你写recv 函数和 accept函数的结合体。

返回值:成功:你接受到的字节数。

              失败:-1.  并且设置errno

2.2  sendto

 ssize_t     sendto  (int sockfd,     const void *buf,     size_t len,     int flags,
                const struct sockaddr *dest_addr,     socklen_t addrlen);

用于向另一个套接字(描述符)发送信息。

参数1:  套接字

参数2 :你想发的字符串

参数3: 参数2的长度

参数4 :标志位,经常填写 0

参数5: 你向发送去的 目的地地址。

参数6 :参数5的长度 

注意区别

返回值:成功:你写入的字节数。

              失败:-1.  并且设置errno

相关推荐

  1. udp连接客户服务代码

    2024-01-30 14:54:02       69 阅读
  2. UDP客户服务执行bindconnect

    2024-01-30 14:54:02       37 阅读
  3. 【Linux】基于Udp的简易服务客户

    2024-01-30 14:54:02       33 阅读
  4. netty udp创建服务+客户

    2024-01-30 14:54:02       26 阅读
  5. epoll服务客户示例代码

    2024-01-30 14:54:02       30 阅读
  6. UDP服务器客户的创建步骤

    2024-01-30 14:54:02       43 阅读
  7. 基于UDP的网络客户服务模型IO函数

    2024-01-30 14:54:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-30 14:54:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-30 14:54:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-30 14:54:02       82 阅读
  4. Python语言-面向对象

    2024-01-30 14:54:02       91 阅读

热门阅读

  1. 快捷键:IDEA 清理无效导入依赖

    2024-01-30 14:54:02       54 阅读
  2. STL之stack 【栈】

    2024-01-30 14:54:02       55 阅读
  3. VA_LIST可变参数列表使用学习

    2024-01-30 14:54:02       53 阅读
  4. 正则表达式 grep

    2024-01-30 14:54:02       52 阅读
  5. STM32 1-5

    STM32 1-5

    2024-01-30 14:54:02      44 阅读
  6. 【iOS ARKit】光照效果--光源

    2024-01-30 14:54:02       52 阅读
  7. C. Did We Get Everything Covered?

    2024-01-30 14:54:02       56 阅读
  8. k8s默认seccomp禁用研究

    2024-01-30 14:54:02       62 阅读