1. 程式人生 > >Linux C UDP Socket實現客戶與伺服器簡單通訊

Linux C UDP Socket實現客戶與伺服器簡單通訊

在linux平臺下用c語言udp協議實現客戶與伺服器的簡單通訊與封裝的實現

一、伺服器端

1、新建CreateServer.c和CreateServer.h檔案,伺服器的建立程式碼在此實現,程式中封裝了建立TcpSocket和UdpSocket伺服器的方法,可直接呼叫函式建立伺服器,客戶端的業務則單獨處理,方便了邏輯設計與程式碼移植。

CreateServer.h程式碼如下:

#ifndef CREATESERVER_H
#define CREATESERVER_H

int create_tcp_server(int);
int create_udp_server(int);

#endif // CREATESERVER_H

CreateServer.c程式碼如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define LISTEN_SIZE 20

int start_server(int port, int type){
    //建立伺服器套接字
    int ss = socket(AF_INET, type, 0);
    if(ss < 0){
        printf("create socket error\n");
        return -1;
    }

    //設定伺服器地址
struct sockaddr_in server_addr; //伺服器地址結構 bzero(&server_addr, sizeof(struct sockaddr_in)); //清零 server_addr.sin_family = AF_INET; //協議族 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //ip地址 server_addr.sin_port = htons(port); //埠 //繫結地址結構到套接字描述符 if(bind(ss, (struct sockaddr*)&server_addr, sizeof
(server_addr)) < 0){ printf("bind error\n"); return -1; } //TCP if(SOCK_STREAM == type){ //設定偵聽 if(listen(ss, LISTEN_SIZE) < 0){ printf("listen error\n"); return -1; } printf("tcp server start\n"); } else printf("udp server start\n"); return ss; } int create_tcp_server(int port){ start_server(port, SOCK_STREAM); } int create_udp_server(int port){ start_server(port, SOCK_DGRAM); }

main.c程式碼如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8888
#define BUFF_LEN 1024

void udpserv_echo(int ss, struct sockaddr* client){
    int n;
    char buff[BUFF_LEN];
    socklen_t len;
    while(1){
        bzero(buff, BUFF_LEN);
        len = sizeof(*client);
        n = recvfrom(ss, buff, BUFF_LEN, 0, client, &len);
        sendto(ss, buff, n, 0, client, len);
        printf("%s\n", buff);
    }
}

int main(){
    int ss = create_udp_server(PORT);
    if(-1 == ss)
        exit(-1);

    //回顯處理程式
    struct sockaddr_in addr_clie;
    udpserv_echo(ss, (struct sockaddr*)&addr_clie);
    close(ss);
    return 0;
}

二、客戶端
客戶端Socket.h和Socket.c封裝了建立TcpSocket和UdpSocket的程式碼,可直接呼叫函式連線到伺服器。

Socket.h程式碼如下:

#ifndef SOCKET_H
#define SOCKET_H
int connect_tcp(char*, int);
int connect_udp(char*, int);
#endif // SOCKET_H

Socket.c程式碼如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int connectsock(char* server_ip, int server_port, int type){
    int sock_fd = socket(AF_INET, type, 0);
    if(-1 == sock_fd){
        printf("create socket error\n");
        return -1;
    }
    struct sockaddr_in server_addr;
    //設定伺服器地址
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(server_port);
    inet_pton(AF_INET, server_ip, &server_addr.sin_addr);

    //連線伺服器
    if(-1 == connect(sock_fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in))){
        printf("connect server error\n");
        return -1;
    }

    printf("connect server success\n");
    return sock_fd;
}
int connect_tcp(char* server_ip, int server_port){
    return connectsock(server_ip, server_port, SOCK_STREAM);
}
int connect_udp(char* server_ip, int server_port){
    return connectsock(server_ip, server_port, SOCK_DGRAM);
}

main.c程式碼如下:

#include <stdio.h>
#include <string.h>

#define IP "127.0.0.1"
#define PORT 8888
#define BUFF_LEN 1024

void udpclie_echo(int s){
    char buff[BUFF_LEN];
    while(1){
        bzero(buff, BUFF_LEN);
        scanf("%s", buff);
        write(s, buff, BUFF_LEN);
        bzero(buff, BUFF_LEN);
        read(s, buff, BUFF_LEN);
        printf("recved:%s\n",buff);
    }
}

int main(){
    int s = connect_udp(IP, PORT);
    if(-1 == s)
        exit(-1);
    udpclie_echo(s);
    close(s);
    return 0;
}