原文:
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 8 typedef 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 6080 typedef 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 client server: server.c gcc -o server server.c - pthread client: client.c gcc -o client client.c - pthread clean: 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
去年的代码,做个备份。