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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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

//udp   客户端代码 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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

你可能感兴趣的:(就业班视频学习,udp,linux,c++)