才看完tcp协议这一块,写这篇博客的目的主要是为了加深印象,把大致流程梳理下。
用网络调试助手模拟多个客户端,实现的tcp服务器功能:客户端发送什么数据,再转发回去。支持多个客户端。代码采用一个客户请求创建一个线程进行处理的方式。
代码如下:
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#define SERV_PORT 6666
#define BUFFER_SIZE 128
//实现tcp服务器
//功能:把接收到的数据发送给客户端
//线程处理函数
void *client_thread(void *arg)
{
int clientfd = *(int *)arg;
//循环多次接收数据
while(1)
{
char buffer[BUFFER_SIZE] = {0};
int count = recv(clientfd,buffer,BUFFER_SIZE,0);
if(!count)//如果连接断开,跳出
{
break;
}
//打印每次收到的数据
printf("recv:%s\n",buffer);
send(clientfd,buffer,count,0);
}
close(clientfd);
}
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(-1 == bind(sockfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr)))
{
perror("bind");
return -1;
}
listen(sockfd,10);
while(1)
{
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
int clientfd = accept(sockfd,(struct sockaddr*)&clientaddr,&len);
pthread_t thid;
pthread_create(&thid,NULL,client_thread,&clientfd);
}
}