tcp线程进程多并发

tcp线程多并发

#include<myhead.h>

#define SERPORT 8888

#define SERIP "192.168.0.118"

#define BACKLOG 20

typedef struct

{

int newfd;

struct sockaddr_in cin;

}BMH;

void *fun1(void *sss)

{

int newfd=accept((BMH *)sss)->newfd;

struct sockaddr_in cin=((HMY *)sss)->cin;

char buff1000;

while(1)

{

bzero(buff,sizeof(buff));

int len=recv(newfd,buff,sizeof(buff),0);

printf("收到%s:%d的信息%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buff);

if(len==0)

{

printf("客户端退出");

break;

}

strcat(buff,"xxx");

send(newfd,buff,sizeof(buff),0);

printf("发送成功\n");

}

pthread_exit(NULL);

}

int main(int argc, const char *argv\[\])

{

int oldfd=socket(AF_INET,SOCK_STREAM,0);

if(oldfd==-1)

{

perror("oldfd");

return -1;

}

int bmz=8;

if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&bmz,sizeof(bmz))==-1)

{

perror("setsockopt");

return -1;

}

printf("端口快速复用应用成功\n");

struct sockaddr_in sin={

.sin_failmy=AF_INET,

.sin_port=htons(SERPORT),

.sin_addr.s_addr=inet_addr(SERIP)

};

if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1)

{

perror(bind);

return -1;

}

if(listen(oldfd,BACKLOG)==-1)

{

perror("listen");

return -1;

}

printf("监听成功\n");

struct sockaddr_in cin;

int cinlen=sizeof(cin);

BMH MSG;

while(1)

{

int newfd=accept(oldfd,(struct sockaddr *)&cin,&cinlen);

if(newfd==-1)

{

perror("accept");

return -1;

}

printf("%s:%d客户端连接\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

MSG.newfd=newfd;

MSG.cin=cin;

pthread_t tid;

if(pthread_create(&tid,NULL,fun1,MSG)!=0)

{

perror("pthread_create");

return -1;

}

pthread_detach(tid);

}

return 0;

}

tcp进程多并发

#include <myhead.h>

#define SERPORT 9999

#define SERIP "192.168.0.130"

#define BACKLOG 10

void hande(int sss)

{

if(sss==SIGCHLD)

{

while(waitpid(-1,NULL,WNOHANG)!=-1);

}

}

int main(int argc, const char *argv\[\])

{

#if 1

if(signal(SIGCHLD,hande)==SIG_ERR)//捕获子进程退出的信号

{

perror("signal");

return -1;

}

#endif

int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、创建原始套接字

if(oldfd ==-1)

{

perror("socket");

return -1;

}

int kkk=666;

if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&kkk,sizeof(kkk))==-1)//端口号快速复用

{

printf("setsockopt");

return -1;

}

printf("端口快速复用成功\n");

struct sockaddr_in sin = {

.sin_family = AF_INET,

.sin_port = htons(SERPORT),

.sin_addr.s_addr = inet_addr(SERIP)

};

if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1)//2、绑定

{

perror("bind");

return -1;

}

if(listen(oldfd,BACKLOG)==-1)

{

perror("listen");

return -1;

}

//接下来创建子进程,父进程负责接收客户端请求,子进程负责数据收发

struct sockaddr_in cin;

int cinlen = sizeof(cin);

while(1)

{

int newfd = accept(oldfd,(struct sockaddr *)&cin,&cinlen);

if(newfd==-1)

{

perror("accept");

return -1;

}

printf("newfd = %d\n",newfd);

printf("%s:%d连接成功\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

pid_t pid = fork();

if(pid>0)

{

close(newfd);

}

else if(pid==0)

{

close(oldfd);

char buff1024;

while(1)

{

int len = recv(newfd,buff,sizeof(buff),0);

if(len==0)

{

printf("客户端退出\n");

break;

}

printf("服务器收到信息:%s\n",buff);

strcat(buff,"^_^");

send(newfd,buff,sizeof(buff),0);

printf("发送成功\n");

}

exit(0);

}

else{

perror("fork");

return -1;

}

}

close(oldfd);

return 0;

}

相关推荐
AI小老六15 分钟前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize2 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考15 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队18 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法