基於UDP程式設計

學習不畢業發表於2020-09-25

基於UDP程式設計
1 UDP是資料包協議,無連線的,不可靠,追求傳輸效率的一種通訊協議資料的傳送和接收是同步的.在進行通訊之前,不需要建立連線.其傳輸效率比TCP高.對其伺服器而言,並沒有三次握手的過程.因此和TCP相比,少了被動監聽(listen)和(accept).只需要建立通訊裝置,繫結IP地址和埠號.然後進行資料的收發.

1.伺服器端的程式設計模型

  1. 建立一個socket端點,返回該端點的檔案描述符fd socket(2)
    2 )將fd和本地地址繫結 bind(2)

while(1){
3) 阻塞等待客戶端訊息 recvfrom(2)
4 )處理客戶訊息
5 )將處理結果傳送給客戶端 sendto(2)
}
2 客戶端的程式設計模型
1 建立一個socket端點 socket(2)
2 使用fd裝置向伺服器傳送訊息 sendto(2)
3 阻塞等待伺服器的響應訊息 recvfrom(2)
4 處理響應訊息
4 關閉fd裝置 close(2)

程式設計實現
伺服器端

#include <stdio.h>
#include <t_net.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
int main(void){
    SA4 cli;
    char buf[128];
    socklen_t len;
    int fd = bind_sock(AF_INET,SOCK_DGRAM,8000);
    if(fd == -1){
        printf("%s\n",strerror(errno));
        return -1; 
    }   
    while(1){
        len = sizeof(cli);
        int recv = recvfrom(fd,buf,128,0,(SA*)&cli,&len);
        if(recv == -1){
            printf("%s\n",strerror(errno));
                  return -1;
        }
        for(int i = 0;i < recv;i++){
            buf[i] = toupper(buf[i]);
        }
        sendto(fd,buf,recv,0,(SA*)&cli,sizeof(cli));
    }
    return 0;
}                                                                     ``

關於t_net.h,參見博主上一篇部落格:TCP併發服務的實現
客戶端

#include <stdio.h>
#include <errno.h>
#include <t_net.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc,char* argv[]){
    char msg[128];
    char buf[128];
    int fd = socket(AF_INET,SOCK_DGRAM,0);
    if(fd == -1){
        printf("%s\n",strerror(errno));
        return 0;
    }   
    SA4 serv;
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8000);
    inet_pton(AF_INET,argv[1],&serv.sin_addr);
	while(1){
        gets(msg);
        //printf("%d\n",sizeof(msg));
        sendto(fd,msg,strlen(msg) + 1,0,(SA*)&serv,sizeof(serv));
        int recv = recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
        if(recv > 0){
            //write(1,buf,recv);
            printf("%s\n",buf);
            if(strcmp(buf,"BYEBYE") == 0) break;
        }
    }
    close(fd);
    return 0;
}

相關文章