Linux C TCP Socket实现客户与服务器简单通信

来源:互联网 发布:js鼠标事件怎么用 编辑:程序博客网 时间:2024/05/17 10:39

在Linux平台下用C语言udp协议实现客户与服务器的简单通信与封装的实现

一、服务器端

1、新建CreateServer.c和CreateServer.h文件,服务器的创建代码在此实现,程序中封装了创建TcpSocket和UdpSocket服务器的方法,可直接调用函数创建服务器,客户端的业务则单独处理,方便了逻辑设计与代码移植。

CreateServer.h代码如下:

#ifndef CREATESERVER_H#define CREATESERVER_Hint create_tcp_server(int);int create_udp_server(int);#endif // CREATESERVER_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

CreateServer.c代码如下:

#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#define LISTEN_SIZE 20int 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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

main.c代码如下:

#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#define PORT 8888#define BUFF_LEN 1024int client_sock;void process_client();int main(){    int ss = create_tcp_server(PORT);    if(-1 == ss)        exit(-1);    while(1){        //接受客户端连接        socklen_t addrlen = sizeof(struct sockaddr);        struct sockaddr_in client_addr; //客户端地址结构        client_sock = accept(ss, (struct sockaddr*)&client_addr, &addrlen);        if(client_sock < 0){            printf("accept error\n");        }        printf("accept success\n");        pthread_t pid;        if(pthread_create(&pid, NULL, process_client, NULL) < 0){            printf("pthread_create error\n");        }    }}//处理客户端void process_client(){    int sc = client_sock;    ssize_t size = 0;    char buffer[BUFF_LEN];    while(1){        memset(buffer, 0, sizeof(BUFF_LEN));        size = read(sc, buffer, BUFF_LEN);        if(size > 0){            printf("%s\n", buffer);            write(sc, buffer, BUFF_LEN);        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

二、客户端 
客户端Socket.h和Socket.c封装了创建TcpSocket和UdpSocket的代码,可直接调用函数连接到服务器。

Socket.h代码如下:

#ifndef SOCKET_H#define SOCKET_Hint connect_tcp(char*, int);int connect_udp(char*, int);#endif // SOCKET_H
  • 1
  • 2
  • 3
  • 4
  • 5

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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

main.c代码如下:

#include <stdio.h>#include <fcntl.h>#include <pthread.h>#define SERVER "127.0.0.1"#define PORT 8888#define BUFF_SIZE 1024int sock;//从服务器读取消息void read_data_from_server(){    char buffer[BUFF_SIZE];    ssize_t size;    while(1){        memset(buffer, 0, sizeof(buffer));        size = read(sock, buffer, BUFF_SIZE);        if(size > 0)            printf("%s\n", buffer);        else if(-1 == size)            printf("read error\n");    }}//向服务器发送消息void write_data_to_server(){    char data[BUFF_SIZE];    while(1){        memset(data, 0, sizeof(data));        scanf("%s", data);        if(-1 == write(sock, data, sizeof(data)))            printf("write error\n");    }}int main(){    sock = connect_tcp(SERVER, PORT);    if(-1 == sock)        return -1;    pthread_t pid;    pthread_create(&pid, NULL, read_data_from_server, NULL);    write_data_to_server();    close(sock);    return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

源码下载地址: 
https://github.com/Wushaoling/Linux-C-Socket/tree/master/TCP/TCP%E7%AE%80%E5%8D%95%E6%95%B0%E6%8D%AE%E5%8F%91%E9%80%81

0 0
原创粉丝点击