在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
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); server_addr.sin_port = htons(port); if(bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){ printf("bind error\n"); return -1; } 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
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