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;

}

相关推荐
坚持编程的菜鸟6 小时前
模拟实现memmove
c语言·算法·模拟实现memmove
wabs6667 小时前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
坚持编程的菜鸟7 小时前
编写判断大小端程序
c语言·算法·判断大小端
papaofdoudou7 小时前
判断排列逆序奇偶性的乘积判别法(范德蒙德符号法)
人工智能·算法
linux-hzh8 小时前
百日算法修炼 · Day 03
java·算法
问商十三载8 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法
嵌入式老牛9 小时前
三相电气量采集模块设计(三)非同步采样时的精度提升
算法·精度·计量
今天AI了吗10 小时前
精细化落地教程:TimechoAI调参标准+数据清洗规范+误差归因+阈值适配全维度指南
大数据·人工智能·算法
zephyr0511 小时前
从递归到迭代:二叉树非递归前中后序遍历详解
算法
Dr.kangder11 小时前
嵌入式总线设备解析——TTE总线应用与实践
开发语言·网络·算法·嵌入式·多任务·同步机制