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 buff[1000];

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 buff[1024];

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;

}

相关推荐
资深web全栈开发39 分钟前
LeetCode 3625. 统计梯形的数目 II
算法·leetcode·组合数学
橘颂TA40 分钟前
【剑斩OFFER】算法的暴力美学——外观数列
算法·leetcode·职场和发展·结构与算法
Liangwei Lin41 分钟前
洛谷 P1434 [SHOI2002] 滑雪
算法
c#上位机1 小时前
halcon图像增强之自动灰度拉伸
图像处理·算法·c#·halcon·图像增强
rit84324991 小时前
压缩感知信号恢复算法:OMP与CoSaMP对比分析
数据库·人工智能·算法
Pluchon2 小时前
硅基计划4.0 算法 FloodFill算法
java·算法·leetcode·决策树·逻辑回归·深度优先·图搜索算法
菜鸟233号2 小时前
力扣347. 前k个高频元素 java实现
算法
Xの哲學3 小时前
Linux设备管理:从内核驱动到用户空间的完整架构解析
linux·服务器·算法·架构·边缘计算
xinyu_Jina3 小时前
Info Flow:去中心化数据流、跨协议标准化与信息源权重算法
算法·去中心化·区块链
Jac_kie_層樓4 小时前
力扣hot100刷题记录(12.2)
算法·leetcode·职场和发展