Makefile文件
CC = gcc
CPFLAGS =
TARGET = server.exe
OJBS = test.c
all:$(TARGET)
run:all
.\$(TARGET)
$(TARGET):$(OJBS)
$(CC) $(CPFLAGS) -o $@ $^
.PTHONY=clean
clean:
rm -f $(TARGET)
server.c文件
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>
#include <fcntl.h>
const int server_port=6800;
struct s_info // 定义client信息结构体
{
struct sockaddr_in client_addr;
int cli_fd;
}s[10];
// 处理client请求,将收到的字符串返回
void * client_tackle(void * arg)
{
struct s_info * arg_cli=(struct s_info *)arg;
char buff[1024]={0},buff_s[1028]={0};
write(arg_cli->cli_fd,"socket established.\n",sizeof("socket established.\n"));
while(1)
{
int read_num=read(arg_cli->cli_fd,buff,sizeof(buff));
if(read_num==0)
{
printf("%s:%d socket stream closed\n",
inet_ntoa(arg_cli->client_addr.sin_addr),ntohs(arg_cli->client_addr.sin_port));
fflush(stdout);
break;
}
else
{
write(arg_cli->cli_fd,buff,strlen(buff) );
printf("%s",buff);
fflush(stdout);
bzero(buff,sizeof(buff));
}
}
close(arg_cli->cli_fd);
}
int main(int argc,char *argv[])
{
int sfd,cfd,n,i=0;
pthread_t pid; // 线程号
struct sockaddr_in ser_addr,cli_addr;
bzero(&cli_addr,sizeof(cli_addr)); // 置零client地址
// 填充server地址
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(server_port);
socklen_t cli_addr_len;
sfd=socket(AF_INET,SOCK_STREAM,0); // 建立socket
setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&n,4);
int ret=bind(sfd,(const struct sockaddr *)&ser_addr,sizeof(ser_addr)); // 绑定socket
if(ret<0)
{
perror("bind error:");
}
listen(sfd,5); // 监听
printf("waiting for connect.\n");
fflush(stdout);
// 对收到的请求进行处理
while(1)
{
cfd=accept(sfd,(struct sockaddr *)&cli_addr,&cli_addr_len); // 接受请求
s[i].cli_fd=cfd;
s[i].client_addr=cli_addr;
printf("%s:%d request to connect.\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
fflush(stdout);
pthread_create(&pid,NULL,client_tackle,(void *)&s[i]); // 创建线程处理请求
pthread_detach(pid); // 线程后台运行
i++;
if(i==10)
{
i=0;
}
}
close(sfd);
return 0;
}
可以用netcat工具进行测试。