#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
// 回调函数(传入clientfd)
void *client_routine(void *arg)
{
//初始化一个工作套接字
int clientfd = *(int *)arg;
while(1)
{
char buffer[1024] = {0};
//接收信息
int len = recv(clientfd, buffer, 1024, 0);
if(len <= 0)
{
close(clientfd);
break;
}
else
{
printf("Recv : %s %d byte(s)\n", buffer, len);
}
}
}
//一请求一线程
int main(int argc, char* argv[])
{
if(argc < 2)
{
printf("Param Error\n");
return -1;
}
//atoi把参数 str 所指向的字符串转换为一个整数(类型为 int 型)
int port = atoi(argv[1]);
//初始化socket套接字
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
//初始化信息
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
//绑定信息与套接字
if(bind(socketfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0)
{
perror("bind");
return -2;
}
//监听请求
if(listen(socketfd, 5) < 0)
{
perror("listen");
return -3;
}
while(1)
{ //初始化接收
struct sockaddr_in clinet_addr;
memset(&clinet_addr, 0, sizeof(struct sockaddr_in));
socklen_t client_addr_len = sizeof(clinet_addr);
//接收一个请求返回一个套接字clientfd
int clientfd = accept(socketfd, (struct sockaddr*)&clinet_addr, &client_addr_len);
//回调处理
pthread_t thread_id;
pthread_create(&thread_id, NULL, client_routine, &clientfd);
}
}
C语言简易多线程TCP服务器(一请求一线程)
于 2022-04-28 13:43:30 首次发布