Linux-C语言编写-UDP服务器客户端通信流程简介(代码)

目录

一,服务器

1.创建数据报套接字

2.填充结构体

3.绑定服务器的ip和端口

4.接收来自客户端的消息 recvfrom

5.关闭套接字

6.详细代码

二,客户端

1.创建数据报套接字

2.填充结构体,填充为服务器的ip和端口

3.向服务器发送消息sendto

4.关闭套接字

5.详细代码


一,服务器

1.创建数据报套接字

//socket函数返回一个用于通信的文件描述符,定义sockfd来接收
int sockfd;
//函数参数,第一个仍是ipv4,第二个是数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM,0);

2.填充结构体

//填充结构体的目的是告诉程序,发出的数据要发往谁;,因为要发往服务器,所以要填充为服务器
struct sockaddr_in serveraddr, clientaddr;
serveraddr.sin_family = AF_INET;
//从终端输入端口号,htons将主机字节顺序转化为网络字节顺序
//atoi将字符串形式的端口号转化为数值形式的端口号
serveraddr.sin_port = htons(atoi(argv[1]));
//inet_addr将主机字节序(小端)转化为网络字节序(大端)
serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");

3.绑定服务器的ip和端口

if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
{
	perror("bind err");
	return -1;
}
//提示绑定成功
printf("bind ok\n");

4.接收来自客户端的消息recvfrom

//计算客户端地址长度
socklen_t len = sizeof(clientaddr);
//recvfrom函数中定义的返回值的类型
ssize_t recvbyte;
char buf[128];
//接收数据
//recv第五个参数为发送数据的一端的地址及端口信息
memset(buf, 0, sizeof(buf));
recvbyte = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &len);
if (recvbyte < 0)
{
	perror("recvfrom err");
	return -1;
}else if(recvbyte == 0)
{
    //返回值为0时,表示客户端退出
	printf("client exit\n");
}else{
    //打印客户端的详情信息和发送的消息
		printf("ip = %s,port = %d->buf:%s\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buf);
}

5.关闭套接字

close(sockfd);

6.详细代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    //1.创建一个数据报套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket error.");
        return -1;
    } //填充结构体
    struct sockaddr_in serveraddr, clientaddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[1]));
    serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");

    socklen_t len = sizeof(clientaddr);

    //2.绑定服务器端ip地址和端口
    if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
    {
        perror("bind err.");
        return -1;
    }
    ssize_t recvbyte;
    char buf[128];
    while (1)
    {
        recvbyte = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &len);
        if (recvbyte < 0)
        {
            perror("recvfrom err.");
            return -1;
        }
        printf("ip=%s,port=%d->client:%s\n", inet_ntoa(clientaddr.sin_addr),
               ntohs(clientaddr.sin_port), buf);
    }
    close(sockfd);
    return 0;
}

二,客户端

1.创建数据报套接字

同服务器;

2.填充结构体,填充为服务器的ip和端口

同服务器;

3.向服务器发送消息sendto

char buf[128];
fgets(buf,sizeof(buf),stdin);
if(buf[strlen(buf)-1]=='\n')
{
  buf[strlen(buf)-1]='\0';
}
sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

4.关闭套接字

close(sockfd);

5.详细代码

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    //1.
    if(sockfd < 0)
    {
        perror("socket err.");
        return -1;
    }
    //2.
    struct sockaddr_in serveraddr,tempaddr;
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr=inet_addr(argv[1]);

    //3.
    char buf[128];
    while(1)
    {
        fgets(buf,sizeof(buf),stdin);
        if(buf[strlen(buf)-1]=='\n')
        {
          buf[strlen(buf)-1]='\0';
        }
        sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

    }
    //4.
    close(sockfd);
    return 0;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值