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]