📄 server1.c
字号:
/*
**server.c--a stream socket server demo
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#define MYPORT 3490 //the port users will be connecting to
#define BACKLOG 10 //how many pending connections queue will hold
void sigchld_handler(int s)
{
while(wait(NULL)>0);
}
int main(void)
{
int sockfd, new_fd; //listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr; //my address information
struct sockaddr_in their_addr;//connector's address information
int sin_size;
struct sigaction sa;
int yes=1;
char *recvbuf;
char *caddr;
int numbytes;
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
perror("socket");
exit(1);
}
printf("SOCK_FD=%d\n", sockfd);
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))==-1){
perror("setsockopt");
exit(1);
}
my_addr.sin_family=AF_INET; //host byte order
my_addr.sin_port=htons(MYPORT); //short, network byte order
my_addr.sin_addr.s_addr=INADDR_ANY;//automatically fill with my IP
memset(&(my_addr.sin_zero), '\0', 8);//zero the rest of the struct
if(bind(sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr))==-1){
perror("bind");
exit(1);
}
if(listen(sockfd, BACKLOG)==-1){
perror("listen");
exit(1);
}
sa.sa_handler=sigchld_handler; //reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags=SA_RESTART;
if(sigaction(SIGCHLD, &sa, NULL)==-1){
perror("sigaction");
exit(1);
}
while(1){ //main accept() loop
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&their_addr, &sin_size))==-1){
perror("accept");
continue;
}
printf("server: got connection from %s\n",(char*)inet_ntoa(their_addr.sin_addr));
//if(!fork()){ //this is the child process
close(sockfd); //child doesn't need the listener
recvbuf=(char*)calloc(128,sizeof(char));
for(;;){
numbytes=recv(new_fd, recvbuf,128,0);
if(numbytes<0){
perror("recv");
close(new_fd);
exit(1);
}
else if(numbytes==0||strncmp(recvbuf,"fin",3)==0){
printf("clinet(%s) has been disconnected\n",(char*)inet_ntoa(their_addr.sin_addr));
close(new_fd);
exit(0);
break;
}
printf("Received from %s: %s\n", inet_ntoa(their_addr.sin_addr),recvbuf);
void replace_string(char * source_str,char * targ_str,char *val)
{
char temp_sstr[513],result[513];
char * p,*q;
int len;
len=0;
q=p=NULL;
memset(result,0,sizeof(result));
memset(temp_sstr,0,sizeof(temp_sstr));
strcpy(temp_sstr,source_str);
p=q=temp_sstr;
len=strlen(targ_str);
while(q!=NULL)
{
if((q=strstr(p,targ_str))!=NULL)
{
strncat(result,p,q-p);
strcat(result,val);
strcat(result,"\0");
q+=len;
p=q;
}
else strcat(result,p);
}
strcpy(source_str,result);
}
replace_string(recvbuf, "a", "a*");
replace_string(recvbuf, "i", "i*");
replace_string(recvbuf, "o", "o*");
replace_string(recvbuf, "u", "u*");
replace_string(recvbuf, "e", "e*");
if(send(new_fd, recvbuf, numbytes, 0)==-1){
perror("send");
close(new_fd);
exit(1);
}
}
close(new_fd);
exit(0);
// }
close(new_fd); //parent doesn't need this
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -