1. 程式人生 > >udp編程 實例

udp編程 實例

clu char unistd.h 接收 完整 發送數據 get 客戶端 style

server端

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <errno.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <string.h>  
  
void server(int sock){  
    //1、建立接收緩存字節數組  
    char recvbuf[1024
] = {0}; //2、定義socket struct sockaddr_in peeraddr; socklen_t peerlen; int n; while(1){ // peerlen = sizeof(peeraddr); //3、清空接收緩存數組 memset(recvbuf, 0, sizeof(recvbuf)); //4、開始接收數據 n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0
, (struct sockaddr *)&peeraddr, &peerlen); //5、判斷是否接收完整數據 if(n == -1){ perror("recvfrom"); exit(EXIT_FAILURE); }else if(n > 0){ //6、成功接收數據,將緩存數據寫入到標準輸出,打印到控制臺 fputs(recvbuf, stdout); //7、想客戶端回送接收到的數據(回顯客戶端輸入的數據)
sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen); } } //關閉socket close(sock); } int main(void){ int sock; //創建服務器socket if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket error"); exit(EXIT_FAILURE); } //設置服務器socket參數 struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); //設置socket的協議、端口以及地址 servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //將socket綁定地址 if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){ perror("bind error"); exit(EXIT_FAILURE); } server(sock); return 0; }

client端

#include <unistd.h>  
#include <sys/types.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <errno.h>  
#include <string.h>  
      
void client(int sock){  
    //2、設置客戶端socket參數  
    struct sockaddr_in servaddr;  
    memset(&servaddr, 0, sizeof(servaddr));  
    //3、設置傳輸協議、端口以及目的地址  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(5188);  
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  
    //4、創建發送與接收緩存字節數組  
    int ret;  
    char sendbuf[1024] = {0};  
    char recvbuf[1024] = {0};  
    //5、開始發送數據(此處是發送來自標準輸入的數據)  
    while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){  
        sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));  
        //6、開始接收數據,接收服務端返回的數據  
        ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);  
        if(ret == -1){  
            perror("recvfrom");  
            exit(EXIT_FAILURE);  
        }  
  
        //fputs(recvbuf, stdout);       //將服務端返回的數據寫入到標準輸出  
          
        //7、清空發送與接收緩存  
        memset(sendbuf, 0, sizeof(sendbuf));  
        memset(recvbuf, 0, sizeof(recvbuf));  
    }  
    //8、關閉socket流  
    close(sock);  
}  
  
int main(void){  
    int sock;  
    //1.創建客戶端的socket  
    if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){  
        perror("socket");  
        exit(EXIT_FAILURE);  
    }  
    client(sock);  
    return 0;  
}

udp編程 實例