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);
}
}
转载请注明原文地址: https://lol.8miu.com/read-31444.html