c语言多线程并发服务器

c语言多线程并发服务器

服务端

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<stdlib.h>
#include<pthread.h>
void *run(void *arg);
int main(){
		//lfd:socket返回的文件描述符,用lfd监听并接受客户端连接
   		//cfd:客户端链接上来返回的cfd,用cfd和客户端通信
        int lfd,cfd;
		char client_ip[128];
        //serv_addr服务器地址
        //client_addr客户端地址
        struct sockaddr_in serv_addr,client_addr;
        socklen_t client_len;
        pthread_t tid;
        
        //socket创建服务器返回lfd文件描述符
        lfd = socket(AF_INET,SOCK_STREAM,0);
        bzero(&serv_addr,sizeof(serv_addr));
        //ipv4
        serv_addr.sin_family = AF_INET;
        //端口 本地字节序转网络字节序 host to net short 大小端存储问题
        serv_addr.sin_port = htons(9999);
        //ip host to net long
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        //bind
        bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
        //监听是否有客户连接
        listen(lfd,128);
        printf("wait for connect...\n");
        
        while(1){
           client_len = sizeof(client_addr);//客户端地址长度
           //连接成功返回cfd,用cfd和客户通信
           cfd = accept(lfd,(struct sockaddr*)&client_addr,&client_len);
           printf("client:%s\t%d\n",
		   inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,sizeof(client_ip)),
		   ntohs(client_addr.sin_port));
		   //创建线程 回调 run方法  cfd做参数传入 
           pthread_create(&tid,NULL,run,(void *)cfd);
           
		}
		return 0;
} 
void *run(void *arg){
	int cfd = (int ) arg;
	pthread_detach(pthread_self());
	char buf[1024];//缓冲区
	int len,i;
	while(1){
		len = read(cfd,buf,sizeof(buf));
		printf("receive: %s\n",buf);
		if(len<=0)break;
		for(i=0;i<len;++i)
		    buf[i] = toupper(buf[i]);
		write(cfd,buf,len);
	}
	close(cfd);
}

客户端

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h> 
#define DEST_PORT 9999//目标地址端口号 
#define DEST_IP "127.32.255.2"/*目标地址IP,这里设为本机,不一定非得是127.0.0.1,只要127开头并且不是127.0.0.0和127.255.255.255即可*/ 
#define MAX_DATA 100//接收到的数据最大程度 
 
int main(){
	int sockfd;
	struct sockaddr_in dest_addr;
	char buf[MAX_DATA];
 
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	
	dest_addr.sin_family=AF_INET;
 	dest_addr.sin_port=htons(DEST_PORT);
	dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
	bzero(&(dest_addr.sin_zero),8);
	connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr));

	printf("connect success");
	while(1){
		char send_buf[512] = "";
		scanf("%s",&send_buf);
		write(sockfd,send_buf,sizeof(send_buf));
		
		read(sockfd,send_buf,sizeof(send_buf));
    	printf("client receive:%s\n",send_buf);
	}

	return 0;
} 

centos执行
gcc -o server.out server.c -lpthread
gcc -o client.out client.c -lpthread
得到执行文件server.out,client.out
用xshell 对一个虚拟机开两个item窗口,一个执行./server.out ,另一个执行./client.out,可以开多个客户端通信

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值