第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Linux C TCP Socket实现客户与服务器简单通信

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

时间:2023-02-04 15:42:13

相关推荐

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

在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); //ip地址server_addr.sin_port = htons(port); //端口//绑定地址结构到套接字描述符if(bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){printf("bind error\n");return -1;}//TCPif(SOCK_STREAM == type){//设置侦听if(listen(ss, LISTEN_SIZE) < 0){printf("listen error\n");return -1;}printf("tcp server start\n");}elseprintf("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 <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);}}}

二、客户端

客户端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);}

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;}

源码下载地址:

/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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。