基於UDP協議的Socket網路程式設計

Amiayy發表於2017-08-18

一、基於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);
}

相關文章