1. 编译server、tcpclient并启动
gcc -o server server.c
gcc -o tcpclient tcpclient.c

2.在三个客户端分别输入测试命令
ls
whoami
pwd

3. 通过查看网络状态,客户端是否为多进程实现并发服务器
netstat-anp | grep 8900

发现8900端口的进程有三个不同的pid号,说明启动的三个客户端是三个不同的进程,实现了并发服务器。
4. 测试僵尸进程
- 先关闭一个客户端进程
- 输入命令查看僵尸进程
- 发现僵尸进程的pid不是我的进程的pid号
- 可见程序已经自动清除僵尸进程

源码
server.c
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define PORT 8900
#define BUF_SIZE 2048
int execute(char* command,char* buf);
int main()
{
int sockfd;
struct sockaddr_in client;
struct sockaddr_in server;
char send_buf[BUF_SIZE];
char recv_buf[BUF_SIZE];
char cmd[2048];
int sendnum;
int recvnum;
int length;
int port;
int connected; //change
memset(send_buf,0,2048);
memset(recv_buf,0,2048);
memset(cmd,0,2048); //change
port = PORT;
if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0))) //change
{
perror("generating socket error\n");
exit(1);
}
memset(&server,0,sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(port);
if (-1==bind(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr)))
{
perror("binding error\n");
close(sockfd);
exit(1);
}
if(-1==listen(sockfd,10))
{
perror("listen socket error\n");
close(sockfd);
return -1;
}
length = sizeof(struct sockaddr_in);
while(1)
{
memset(recv_buf,0,2048);
memset(send_buf,0,2048);
if(-1==(connected=accept(sockfd,(struct sockaddr*)&client,&length)))
{
perror("three shakehands error\n");
close(sockfd);
return -1;
}
//change///
int pid = fork();
if((pid=fork())<0)
{
printf("fork failed\n");
_exit(1)

最低0.47元/天 解锁文章
848

被折叠的 条评论
为什么被折叠?



