Linux下socket 编程模拟C/S服务

C/S 1对1的情况下:

//server.c

/***************************************************************************           FileName : server.c       FileFunc : 服务器接收到客户端的一个字符,然后对该字符加1后再发给客户端         Version  : V0.1            Author   : Sunrier            Date     : 2012-06-15       Descp    : Linux下socket编程模拟C/S服务       ***************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc,char *argv[]){int server_sockfd,client_sockfd;unsigned int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;unlink("Server_socket"); server_sockfd = socket(AF_INET,SOCK_STREAM,0); /*为服务器创建一个未命名套接字*/server_address.sin_family = AF_INET; /*命名套接字*/server_address.sin_addr.s_addr = inet_addr("127.0.0.1");server_address.sin_port = htons(9876);server_len = sizeof(server_address);bind(server_sockfd,(struct sockaddr *)&server_address,server_len); /*绑定套接字*/listen(server_sockfd,5); /*创建一个连接队列,开始等待客户进行连接 */while(1){char ch;printf("Server waiting !\r\n");client_len = sizeof(client_address);client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len); /*接收一个客户连接*/if( client_sockfd<0 )continue;read(client_sockfd,&ch,1); /*对套接字上的客户进行读写操作*/ch++;write(client_sockfd,&ch,1);close(client_sockfd);/*break;*/}return 0;}

//client.c

/*******************************************************************            FileName : client.c     FileFunc : 向服务器写入一个字符,然后再从服务器上读取一个字符          Version  : V0.1            Author   : Sunrier            Date     : 2012-06-15       Descp    : Linux下socket编程模拟C/S服务    *******************************************************************/ #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc,char *argv[]){int sockfd;unsigned int uiLen;struct sockaddr_in address;int result;char ch = 'A';sockfd = socket(AF_INET,SOCK_STREAM,0);/*为客户创建一个套接字*/address.sin_family = AF_INET;/*命名套接字,与服务器保持一致*/address.sin_addr.s_addr = inet_addr("127.0.0.1");address.sin_port = htons(9876);uiLen = sizeof(address);result = connect(sockfd,(struct sockaddr *)&address,uiLen);/*连接服务器的套接字*/if( -1==result ){perror("Test:client1");return 1;}write(sockfd,&ch,1);read(sockfd,&ch,1);printf("Char from Server = %c !\n",ch);return 0;}

//makefile

#makefile开始OBJS = server clientall:$(OBJS)CFLAGS = -O -Wall -ansi CC = gcc $(CFLAGS) server:server.c@$(CC) -o $@ $?client:client.c@$(CC) -o $@ $?clean:@ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | xargs rm -rf #makefile结束

运行服务器端:

[Sunrier@localhost socket]$ ./serverServer waiting !Server waiting !Server waiting !

运行客户器端:

[root@localhost socket]# ./clientChar from Server = B ![root@localhost socket]# ./clientChar from Server = B ![root@localhost socket]#

C/S 多对1的情况下:

//server.c

/***************************************************************************           FileName : server.c       FileFunc : 服务器接收到客户端的一个字符,然后对该字符加1后再发给客户端         Version  : V0.1            Author   : Sunrier            Date     : 2012-06-15       Descp    : Linux下socket编程模拟C/S服务       ***************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc,char *argv[]){int server_sockfd,client_sockfd;unsigned int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;unlink("Server_socket"); server_sockfd = socket(AF_INET,SOCK_STREAM,0); /*为服务器创建一个未命名套接字*/server_address.sin_family = AF_INET; /*命名套接字*//*server_address.sin_addr.s_addr = inet_addr("127.0.0.1");*/server_address.sin_addr.s_addr = htonl(INADDR_ANY);server_address.sin_port = htons(9876);server_len = sizeof(server_address);bind(server_sockfd,(struct sockaddr *)&server_address,server_len); /*绑定套接字*/listen(server_sockfd,5); /*创建一个连接队列,开始等待客户进行连接*/while(1){char ch;printf("Server waiting !\r\n");client_len = sizeof(client_address);client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len); /*接收一个客户连接*/if( client_sockfd<0 )continue;read(client_sockfd,&ch,1); /*对套接字上的客户进行读写操作*/ch++;write(client_sockfd,&ch,1);close(client_sockfd);/*break;*/}return 0;}

//client1.c

/*******************************************************************            FileName : client1.c       FileFunc : 客户端1向服务器写入一个字符,然后再从服务器上读取一个字符          Version  : V0.1            Author   : Sunrier            Date     : 2012-06-15       Descp    : Linux下socket编程模拟C/S服务    *******************************************************************/ #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc,char *argv[]){int sockfd;unsigned int uiLen;struct sockaddr_in address;int result;char ch = 'A';sockfd = socket(AF_INET,SOCK_STREAM,0);/*为客户创建一个套接字*/address.sin_family = AF_INET;/*命名套接字,与服务器保持一致*/address.sin_addr.s_addr = inet_addr("127.0.0.5");address.sin_port = htons(9876);uiLen = sizeof(address);result = connect(sockfd,(struct sockaddr *)&address,uiLen);/*连接服务器的套接字*/if( -1==result ){perror("Test:client1");return 1;}write(sockfd,&ch,1);read(sockfd,&ch,1);printf("Char from Server = %c !\n",ch);return 0;}

//client2.c

/*******************************************************************            FileName : client2.c       FileFunc : 客户端2向服务器写入一个字符,然后再从服务器上读取一个字符          Version  : V0.1            Author   : Sunrier            Date     : 2012-06-15       Descp    : Linux下socket编程模拟C/S服务    *******************************************************************/ #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc,char *argv[]){int sockfd;unsigned int uiLen;struct sockaddr_in address;int result;char ch = 'A';sockfd = socket(AF_INET,SOCK_STREAM,0);/*为客户创建一个套接字*/address.sin_family = AF_INET;/*命名套接字,与服务器保持一致*/address.sin_addr.s_addr = inet_addr("127.0.0.6");address.sin_port = htons(9876);uiLen = sizeof(address);result = connect(sockfd,(struct sockaddr *)&address,uiLen);/*连接服务器的套接字*/if( -1==result ){perror("Test:client2");return 1;}write(sockfd,&ch,1);read(sockfd,&ch,1);printf("Char from Server = %c !\n",ch);return 0;}

//makefile

#makefile开始OBJS = server client1 client2all:$(OBJS)CFLAGS = -O -Wall -ansi CC = gcc $(CFLAGS) server:server.c@$(CC) -o $@ $?client1:client1.c@$(CC) -o $@ $?client2:client2.c@$(CC) -o $@ $?clean:@ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | xargs rm -rf #makefile结束

运行服务器端:

[Sunrier@localhost socket]$ ./serverServer waiting !Server waiting !Server waiting !

运行客户器端1:[root@localhost socket]# ./client1Char from Server = B ![root@localhost socket]

运行客户器端2:[root@localhost socket]# ./client2Char from Server = B ![root@localhost socket]

接受自己的失败面,是一种成熟,更是一种睿智;

Linux下socket 编程模拟C/S服务

相关文章:

你感兴趣的文章:

标签云: