Linux 下 简单客户端服务器通讯模型(TCP)
服务器端:server.c
#include#include#include#include#include#include#include#include#include#include
#define ServerPort 6080
#define MaxUser 8typedefstruct_server{intsock_fd;intnew_fd;structsockaddr_in my_addr;
} Server;
typedefstruct_client{intsock_fd;structsockaddr_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){intsin_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(intfd){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){intnew_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#include#include#include#include#include#include#include
#define ServerPort 6080typedefstruct_server{intsock_fd;intnew_fd;structsockaddr_in my_addr;
} Server;
typedefstruct_client{intsock_fd;structsockaddr_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:
[email protected]:/mnt/hgfs/E/Lessons/个人总结/chat# ./server
client said: hello
hehe
client said: g
client said: goodbay
client:
[email protected]:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello
server said : hehe
s^Hg
goodbay
去年的代码,做个备份。
原文:http://www.cnblogs.com/lonelyxmas/p/4157000.html