公共代码:
#pragma once #include<stdio.h> #include<stdint.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<stdlib.h> #include<time.h> #include<stdbool.h> #include<signal.h> #include<sys/wait.h> #define SERVERPORT 9999 #define FTM_STAMP "%lld\r\n" #define PROCNUM 4 #define lv_exit(str)\ perror(str);\ exit(1);
服务端代码:
#include "proto.h"
static void serverjob(int confd)
{
char buf[512] = {0};
int len = sprintf(buf, FTM_STAMP, (long long)time(NULL));
if (send(confd, buf, len, 0) < 0)
{
perror("send");
exit(1);
}
}
static void server_loop(int sfd)
{
struct sockaddr_in cliaddr;
socklen_t clilen = sizeof cliaddr;
while (1)
{
int confd = accept(sfd, (void *)&cliaddr, &clilen);
if (confd < 0)
{
perror("accept");
exit(1);
}
printf("[%d]client %s %d\n",getpid(),inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
serverjob(confd);
close(confd);
}
close(sfd);
}
int main(int argc, char const *argv[])
{
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
{
perror("socket");
exit(1);
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(9999);
seraddr.sin_addr.s_addr = inet_addr("192.168.244.154");
int val = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof val) < 0)
{
perror("setsockopt");
exit(1);
}
if (bind(sfd, (void *)&seraddr, sizeof seraddr) < 0)
{
perror("bind");
exit(1);
}
if (listen(sfd, 10) < 0)
{
perror("listen");
exit(1);
}
signal(SIGCHLD, SIG_IGN);
printf("pid=%d\n",getpid());
for (size_t i = 0; i < PROCNUM; i++)
{
pid_t pid = fork();
if (pid < 0)
{
perror("fork");
exit(1);
}
if (pid == 0)
{
server_loop(sfd);
exit(0);
}
}
for (size_t i = 0; i < PROCNUM; i++)
{
wait(NULL);
}
puts("fu");
close(sfd);
return 0;
}客户端代码:
#include"proto.h"
int main(int argc, char const *argv[])
{
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0){
perror("socket");
exit(1);
}
struct sockaddr_in seraddr;
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(SERVERPORT);
seraddr.sin_addr.s_addr=inet_addr("192.168.244.154");
if(connect(sfd,(void*)&seraddr,sizeof seraddr)<0){
perror("connect");
exit(1);
}
FILE* fp= fdopen(sfd,"r+");
if (fp==NULL)
{
perror("fdopen");
exit(1);
}
long long stamp;
if(fscanf(fp,FTM_STAMP,&stamp)<1){
fprintf(stderr,"Bad format!\n");
}else
{
fprintf(stdout,"stamp=%lld\n",stamp);
}
fclose(fp);
return 0;
}测试流程:
1、启动服务端:

2、启动客户端 watch -n 1 ./cli

3、打开网络检测工具
watch -n 1 "netstat -tan | grep 9999"

4、执行ps -a 监视进程数

0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复