C语言实现TCP服务器——模型(一)

本文介绍了一个简单的TCP服务器程序实现过程,包括初始化套接字、绑定地址、监听连接请求及接收客户端消息等步骤,并通过多线程处理多个客户端连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<pthread.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>


#define MAXSIZE 1024
#define MYPORT 8080
#define MAXLISTEN 20
#define SERVER_IP  "192.168.106.10"


static int sockfdbuf[MAXSIZE]={0};
static char namebuf[MAXSIZE][MAXSIZE]={0};
static char message[MAXSIZE];
struct sockaddr_in server_addr,client_addr;


int tcp_init(int sockfd)
{
sockfd = socket(AF_INET,SOCK_STREAM,0);

if(sockfd == -1)
{
perror("socket error");
exit(1);
}else
{
printf("socket success,sockfd = %d\n",sockfd);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(server_addr.sin_zero,8);


return sockfd;

}


int tcp_bind(int sockfd)
{
int ret;
ret = bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
if(ret!=0)
{
perror("bind error");
exit(1);
}else
{
printf("bind success\n");
}

ret = listen(sockfd,MAXLISTEN);
if(ret!=0)
{
perror("listen error");
exit(1);
}else
{
printf("listen success now!\n");
}


}


int get_clientip(int newsockfd)
{
struct sockaddr_in client;
socklen_t client_len = sizeof(client);
char client_ip[20];
getpeername(newsockfd,(struct sockaddr*)&client,&client_len);
inet_ntop(AF_INET,&client.sin_addr,client_ip,sizeof(client_ip));
printf("client_ip:%s\n",client_ip);

}


void* thread_sed(void* arg)
{
int i;
int ret;
char buffer[200];
int b = (int )arg;
while(1)
{
ret=recv(sockfdbuf[b],buffer,sizeof(buffer),0);
if(ret<0)
{
printf("recv error\n");
}else if(ret == 0)
{
printf("client is close\n");
break;
}else
{
printf("buffer=%s\n",buffer);
}
for(i=0;i<=b;i++)
{
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}
}
}
}


int main()
{
int sockfd;
int ret;
int i=0;
int addrlen=0;
void *val=0;
pthread_t tid1,tid2;
int newsockfd;
sockfd = tcp_init(sockfd);
tcp_bind(sockfd);


addrlen = sizeof(struct sockaddr);
while(1)
{
sockfdbuf[i] = accept(sockfd,(struct sockaddr*)&client_addr,&addrlen);
if(sockfdbuf[i]<=-1)
{
perror("accept error");
exit(1);
}else
{
printf("accept success! newsockfd=%d\n",newsockfd);
}


get_clientip(sockfdbuf[i]);
   
int recbytes=0;
recbytes=recv(sockfdbuf[i],namebuf[i],sizeof(namebuf),0);
if(recbytes == 0)
{
perror("client is close the socket");
exit(1);
}else
{
printf("receive %d bytes from %s client\n",recbytes,namebuf[i]);
printf("name:%s\n",namebuf[i]);
}
int ret=0;
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}

ret = pthread_create(&tid1,NULL,thread_sed,(void*)i);
if(ret!=0)
{
perror("create error");
exit(1);
}else
{
printf("thread create success!\n");
}

i++;
}
pthread_join(tid1,NULL);
close(sockfd);
return 0;
}


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值