服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUFF 30
void errors(char *message) {
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
void read_chilproc(int sig) {
pid_t pid;
int status;
//成功时返回子进程,失败返回-1
pid = waitpid(-1,&status,WNOHANG);//第三个参数表示即使没有终止的子进程,函数不会像wait()一样阻塞,而是返回0
printf("removed proc id: %d\n",pid);
}
int main(int argc,char *argv[])
{
int ser_sock,cli_sock;
struct sockaddr_in ser_addr,cli_addr;
pid_t pid;
struct sigaction act;
socklen_t adr_sz;
int str_len,state,i;
char buf[BUFF];
if(argc != 2) {
printf("Usage: %s <port>\n",argv[0]);
exit(1);
}
act.sa_flags = 0;
act.sa_handler = read_chilproc;
sigemptyset(&act.sa_mask);
state = sigaction(SIGCHLD,&act,0);
ser_sock = socket(PF_INET,SOCK_STREAM,0);
memset(&ser_addr,0,sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons(atoi(argv[1]));
if(bind(ser_sock,(struct sockaddr*)&ser_addr,sizeof(ser_addr)) == -1) {
errors("bind() error");
exit(1);
}
if(listen(ser_sock,5) == -1) {
errors("listen() error");
exit(1);
}
while(1) {
adr_sz = sizeof(cli_addr);
cli_sock = accept(ser_sock,(struct sockaddr*)&cli_addr,&adr_sz);
if(cli_sock == -1) {
continue;
}else puts("new client connected....");
pid = fork();
if(pid == -1) {
close(cli_sock);
continue;
}
if(pid == 0) {
close(ser_sock);
while((str_len = read(cli_sock,buf,BUFF)) != 0) {
for(i = 0; i < BUFF; i++) {
if(buf[i] >= 'a' && buf[i] <= 'z') {
buf[i] -= 32;
}
}
write(cli_sock,buf,str_len);
}
close(cli_sock);
puts("client disconnected...");
exit(0);
}
else close(cli_sock);
}
close(ser_sock);
return 0;
此服务器端将连接的客户端发送的字符串 把小写转化成大写,再发回客户端。