tcp协议编程模型
- 创建 sockedFd socket网络套接字 fd文件描述符
fd是个整数,可以代表网络端口 - 设置服务器协议簇
确定服务器的ip与端口号 - 绑定
将fd和协议簇绑定 - 监听
- 等待客户端连接
服务器和客户端 之间有了一个稳定的数据传输通道 - 通信
处理客户端请求 - 关闭socket
#include<unistd.h>
#include<fcntl.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int initserver();
void handclient(int fd);
int main()
{
int serverFd=initserver();
int clientfd;
while(1)
{
clientfd=accept(serverFd,NULL,NULL);
printf("有客户端连接服务器\n");
handclient(clientfd);
close(clientfd);
}
return 0;
}
int initserver()
{
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd == -1){
printf("创建socket失败:");
return -1;
}
printf("创建socket成功!\n");
struct sockaddr_in addr={0};
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr=INADDR_ANY;
int r = bind(fd,(struct sockaddr*)&addr,sizeof addr);
if(r==-1){
perror("绑定失败:");
close(fd);
return -1;
}
printf("绑定成功!\n");
r = listen(fd,10);
if(r==-1){
perror("监听失败:");
close(fd);
return -1;
}
printf("监听成功!\n");
return fd;
}
void handclient(int fd)
{
char buff[1024*1024]={0};
int r=read(fd,buff,sizeof buff);
if(r>0){
printf("接收到客户端请求:%s\n",buff);
char fileName[20]={0};
sscanf(buff,"GET /%s",fileName);
printf("解析出的文件名为:%s",fileName);
char* mime = NULL;
if(strstr(fileName,".html")){
mime="text/html";
}else if(strstr(fileName,".jpg")){
mime="image/jpg";
}
char response[1024*1024]={0};
sprintf(response,"HTTP/1.1 200 0k\r\nContent-type:%s\r\n\r\n",mime);
int responseLen=strlen(response);
int responseLen=strlen(response);
int fileFd = open(fileName,O_RDONLY);
int fileLen = read(fileFd,response+responseLen,sizeof(response)-responseLen);
write(fd,response,responseLen+fileLen);
close(fileFd);
sleep(2);
}
}