socket
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
int main(){
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_un server_address,client_address;
int result;
char ch='A';
unlink("server_socket");
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
listen(server_sockfd,5);
while(1){
printf("server waiting\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
read(client_sockfd,&ch,1);
ch++;
write(client_sockfd,&ch,1);
//printf("char from server=%c\n",ch);
close(client_sockfd);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
int main(){
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch='A';
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1)exit(1);
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("char from server=%c\n",ch);
close(sockfd);
exit(0);
}
用网络套接字单机实验时,用localhost,即127.0.0.1.
多客戶server
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
int main(){
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address,client_address;
int result;
char ch;
//unlink("server_socket");
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_address.sin_port=9734;
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
listen(server_sockfd,5);
signal(SIGCHLD,SIG_IGN);
while(1){
printf("server waiting\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
if(fork()==0){
read(client_sockfd,&ch,1);
sleep(5);
ch++;
write(client_sockfd,&ch,1);
//printf("char from server=%c\n",ch);
close(client_sockfd);
exit(0);
}
else close(client_sockfd);
}
}
select系统调用(为了克服accept的阻塞问题)
#include<sys/types.h>
#include<sys/time.h>
#include<stdio.h>
#include<fcntl.h>
#include<sys/ioctl.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
char buffer[128];
int result,nread;
fd_set inputs,testfds;
struct timeval timeout;
FD_ZERO(&inputs);//initialized as a null set
FD_SET(0,&inputs);//添加并置位
while(1){
testfds=inputs;
timeout.tv_sec=2;
timeout.tv_usec=500000;
result=select(FD_SETSIZE,&testfds,(fd_set *)NULL,(fd_set *)NULL,&timeout);
switch(result){
case 0:printf("timeout\n");break;
case -1:exit(1);
default:
if(FD_ISSET(0,&testfds)){
ioctl(0,FIONREAD,&nread);//Get the number of bytes that are immediately available for reading.
if(nread==0){
printf("keyboard done\n");
exit(0);
}
nread=read(0,buffer,nread);
buffer[nread]='\0';
printf("read %d from keyboard: %s",nread,buffer);
}
break;
}
}
}
多客戶server(using select)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
#include<sys/time.h>
#include<sys/ioctl.h>
int main(){
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address,client_address;
int result,fd,nread;
char ch;
fd_set readfds,testfds;
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_address.sin_port=9734;
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
listen(server_sockfd,5);
//signal(SIGCHLD,SIG_IGN);
FD_ZERO(&readfds);///FD_SETSIZE is the max number of element in one fd_set
FD_SET(server_sockfd,&readfds);
while(1){
testfds=readfds;
printf("server waiting\n");
result=select(FD_SETSIZE,&testfds,(fd_set *)0,(fd_set *)0,(struct timeval *)0);
if(result<1)exit(1);
for(fd=0;fd<FD_SETSIZE;fd++){
if(FD_ISSET(fd,&testfds)){
if(fd==server_sockfd){
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
FD_SET(client_sockfd,&readfds);
printf("adding client on fd %d \n",client_sockfd);
}
else{
ioctl(fd,FIONREAD,&nread);
if(nread==0){
close(fd);
FD_CLR(fd,&readfds);
printf("removing client on fd %d \n",fd);
}
else{
read(fd,&ch,1);
sleep(5);
printf("serving client on fd %d\n",fd);
ch++;
write(client_sockfd,&ch,1);
}
}
}
}
}
}
没有评论:
发表评论