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 client
all:$(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]$ ./server
Server waiting !
Server waiting !
Server waiting !

 

 

運行客戶器端:

[root@localhost socket]# ./client
Char from Server = B !
[root@localhost socket]# ./client
Char 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 client2
all:$(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]$ ./server
Server waiting !
Server waiting !
Server waiting !

 

 

 運行客戶器端1:
[root@localhost socket]# ./client1
Char from Server = B !
[root@localhost socket]

 

 運行客戶器端2:
[root@localhost socket]# ./client2
Char from Server = B !
[root@localhost socket]

 

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章