Linux网络编程之UDP协议(一版)

最近正在学习网络编程,用UDP来实现服务器端和客户端的收发的简单通信。由于是第一版,所以写的比较粗糙,很多地方都有要改进的地方。例如:包裹函数,把客户端和服务器端共同都包括的头文件,宏都写在一个公共头文件里等等。以后有时间会继续改进。

首先编写服务器端的程序ser_udp.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
    int sockSer = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字,类型参数是SOCK_DGRAM
    if(sockSer == -1)//异常处理
    {
        perror("socket.");
        exit(1);
    }
    struct sockaddr_in addrSer,addrCli;
    addrSer.sin_family = AF_INET;//表示协议用的是ipv4协议
    addrSer.sin_port = htons(8080);//端口号是8080,并且用htons()将本地字节序转换为网络字节序
    addrSer.sin_addr.s_addr = inet_addr("127.0.0.1");//设定ip地址:127.0.0.1
    socklen_t addrlen = sizeof(struct sockaddr);//得到结构的长度
    int ret = bind(sockSer, (struct sockaddr*)&addrSer,addrlen);//j将套接字和结构地址绑定
    if(ret == -1)//异常处理
    {
        close(sockSer);
        perror("bind.");
        exit(1);
    }
    char sendbuf[256];//定义两个字符数组
    char recvbuf[256];
    while(1)
    {
        recvfrom(sockSer, recvbuf,256,0, (struct sockaddr*)&addrCli,&addrlen);//先收客户端发来的信息
        printf("Cli:> %s\n",recvbuf);//打印收到的信息
        printf("Ser:>");
        scanf("%s",sendbuf);//输入要发送的数据
        sendto(sockSer,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&addrCli,addrlen);//向客户端发送消息
    }
}

然后编写客户端的程序cli_udp.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
    int sockCli = socket(AF_INET, SOCK_DGRAM,0);
    if(sockCli == -1)
    {
        perror("socket.");
        exit(1);
    }
    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(8080);
    addrSer.sin_addr.s_addr = inet_addr("127.0.0.1");
    socklen_t addrlen = sizeof(struct sockaddr);
    char sendbuf[256];
    char recvbuf[256];
    while(1)
    {
        printf("Cli:>");
        scanf("%s",sendbuf);
        sendto(sockCli,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&addrSer,addrlen);
        recvfrom(sockCli,recvbuf,256,0,NULL,NULL);
        printf("Ser:> %s\n",recvbuf);
    }
}

鉴于服务器端程序写了详细的注释,客户端就不再写注释。需要强调的是,客户端这边是先发送然后在收,服务器是先收再发,

服务器要先收到客户端相关的网络地址信息,才能建立通信。

猜你喜欢

转载自blog.csdn.net/qq_35353824/article/details/88933181