首页 > 代码库 > Linux 下 简单客户端服务器通讯模型(TCP)
Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP)
服务器端:server.c
#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/socket.h>#include<sys/types.h>#include <stdio.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h>#define ServerPort 6080#define MaxUser 8typedef struct _server{ int sock_fd; int new_fd; struct sockaddr_in my_addr;} Server;typedef struct _client{ int sock_fd; struct sockaddr_in my_addr;} Client;static Server *server;static Client *client;void socket_server_init(Server * server){ server -> my_addr.sin_family = AF_INET; server -> my_addr.sin_port = htons(ServerPort); server -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server -> my_addr.sin_zero),8);}int socket_server_create_bind_listen(Server * server){ int sin_size,ret, on; if((server -> sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){ perror("faild to create socket :\n"); return -1; } on = 1; ret = setsockopt( server -> sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); if(ret=bind(server -> sock_fd, (struct sockaddr *)&server -> my_addr, sizeof(struct sockaddr))==-1){ perror("failed to bind \n"); return -1; } if(listen(server -> sock_fd,MaxUser)==-1){ perror("failed to listen \n"); return -1; } return 1;}void server_send_msg(int fd){ char buff[1024]; while(1){ fgets(buff,1024,stdin); if(send(fd,buff,1024,0)==-1){ perror("error to send :"); break; } }}void server_wait_service(Server *server,Client *client){ int new_fd ,ret,sin_size; char buf[1024]; pthread_t tid; sin_size = sizeof(client ->my_addr); new_fd = accept(server ->sock_fd,(struct sockaddr *)&client->my_addr,&sin_size); if(new_fd <= 0 ){ perror("accept error :"); }else{ ret = pthread_create(&tid,NULL,server_send_msg,new_fd); if(ret!=0){ perror("error to create pthread"); } while(1){ if(recv(new_fd,buf,sizeof(buf),0)>0){ printf("\nclient said:\t\t%s\n",buf); } } }}int main(int arg, char * argv[]){ server = (Server *)malloc(sizeof(Server)); client = (Client *)malloc(sizeof(Client)); socket_server_init(server); if(socket_server_create_bind_listen(server)){ server_wait_service(server,client); } return 0;}
客户端代码:client.c
#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/socket.h>#include<sys/types.h>#include <stdio.h>#include <netdb.h>#define ServerPort 6080typedef struct _server{ int sock_fd; int new_fd; struct sockaddr_in my_addr;} Server;typedef struct _client{ int sock_fd; struct sockaddr_in my_addr;} Client;Server *server;Client *client;void socket_server_init(Server * server){ server -> my_addr.sin_family = AF_INET; server -> my_addr.sin_port = htons(ServerPort); server -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server -> my_addr.sin_zero),8);}void socket_client_init(Client * client){ client -> my_addr.sin_family = AF_INET; client -> my_addr.sin_port = htons(ServerPort+10); client -> my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(client -> my_addr.sin_zero),8);}int socket_client_create_connect(Server * server,Client * client){ if((client -> sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){ perror("failed to create client socket \n"); return -1; } else if(connect(client ->sock_fd, (struct sockaddr *)&server ->my_addr, sizeof(server ->my_addr))==-1){ printf("failed to connect the server \n"); return -1; }else return 1;}void client_recv_msg(Client *client){ char buf[1024]; while(1){ if(recv(client->sock_fd,buf,sizeof(buf),0)>0){ printf("\nserver said :\t\t%s\n",buf); }else break; }}int main(int argc,char* argv[]){ server = (Server *)malloc(sizeof(Server)); client = (Client *)malloc(sizeof(Client)); char data[1024]; socket_server_init(server); socket_client_init(client); pthread_t tid; if(socket_client_create_connect(server,client)){ pthread_create(&tid, NULL,client_recv_msg, client); while(1){ fgets(data,1024,stdin); if(send(client->sock_fd,data,1024,0)==-1){ perror("error to send :"); break; } } } return 0;}
Makefile:
all: server clientserver: server.c gcc -o server server.c -pthreadclient: client.c gcc -o client client.c -pthreadclean: rm -f server client
执行效果:
server:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./server
client said: hello
hehe
client said: g
client said: goodbay
client:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello
server said : hehe
s^Hg
goodbay
去年的代码,做个备份。
Linux 下 简单客户端服务器通讯模型(TCP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。