欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于UDP协议的Socket网络编程

程序员文章站 2022-07-08 19:42:55
...

一、基于UDP协议的Socket网络编程流程:

基于UDP协议的Socket网络编程基于UDP协议的Socket网络编程

采用 UDP 套接字方式实现C/S的通信程序由客户端和服务器端两部分组成。

服务器端进程依次按以下步骤进行:

1) 调用Socket()创建一个数据报套接字;
2) 调用 bind()把服务器地址绑定在该套接字上;
3) 调用recvform()等待客户进程发来的请求,服务器此时处于无限循环状态;
4) 服务进程接收到客户进程所发来的数据报后,进行处理,调用 sendto()将处理结果返回给客户进程,返回状态3) 继续监听;
5) 服务进程调用 close()撤消套接字,终止服务。

客户端进程则按以下步骤进行:

1) 调用Socket ()创建一个数据流套接字;
2) 调用sendto () 向服务器进程发送数据报;
3) 调用recvfrom()等待服务器进程返回该处理结果;
4)客户进程调用close()撤消套接字。

二、代码如下:

服务器端代码:UDP_server.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>


void main()
{
    int sock=socket(PF_INET,SOCK_DGRAM,0);
    assert(sock!=-1);

    struct sockaddr_in ser,cli;//ser服务端,cli客户端
    memset(&ser,0,sizeof(&ser));
    ser.sin_family= AF_INET;//地址族
    ser.sin_port=htons(6500);//端口号(用户向网络,以short类型)
    ser.sin_addr.s_addr=inet_addr("192.168.1.129");//IP地址

    //绑定socket
    int res=bind(sock,(struct sockaddr*)&ser,sizeof(ser));
    assert(res!=-1);

    while(1)
    {
        char buff[128]={0};
        int len=sizeof(cli);
        recvfrom(sock,buff,127,0,(struct sockaddr*)&cli,&len);

        printf("srcaddr:%s,port:%d\n",inet_ntoa(cli.sin_addr),
                ntohs(cli.sin_port));
        printf("buff:%s\n",buff);

        sendto(sock,"OK",2,0,(struct sockaddr*)&cli,len);
    }

    close(sock);
}
客户端代码UDP_client.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>


void main()
{
    int sock=socket(PF_INET,SOCK_DGRAM,0);//第一个参数告诉系统使用哪个底层协议族,对于tcp协议来说,一般设置为PF—INET表示IPv4,PF—INET6表示IPv6;第二个参数表示服务类型为流服务,第三个参数表示默认协议,一般为0;
    assert(sock!=-1);

    struct sockaddr_in ser,cli;//ser服务端,cli客户端
    memset(&ser,0,sizeof(&ser));
    ser.sin_family= AF_INET;//地址族
    ser.sin_port=htons(6500);//端口号(用户向网络,以short类型)
    ser.sin_addr.s_addr=inet_addr("192.168.1.129");//IP地址

    while(1)
    {
        printf("please input: "),fflush(stdout);
        char buff[128]={0};
        fgets(buff,128,stdin);
        buff[strlen(buff)-1]=0;
        int len=sizeof(cli);

        sendto(sock,"OK",strlen(buff),0,(struct sockaddr*)&ser,sizeof(ser));

        memset(buff,0,128);

        recvfrom(sock,buff,127,0,NULL,NULL);
        printf("%s\n",buff);
    }

    close(sock);
}