- sprintf读取字符串时,遇到\0会结束,所以不能用sprintf来读取* pictureBuffer
- void *memcpy(void *str1, const void *str2, size_t n),str2会覆盖str1里的内容
复制代码
#include <func.h>
char pictureBuffer[150 * 1024];
char buffer[200 * 1024];
int main()
{
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1){
perror("socket");
}
int fd = open("./dog.jpg",O_RDONLY);
if(fd == -1){
perror("open");
}
struct stat st;
if (fstat(fd, &st) == -1) {
perror("fstat");
close(fd);
close(sfd);
exit(EXIT_FAILURE);
}
size_t fileSize = st.st_size;
memset(pictureBuffer,0,sizeof(pictureBuffer));
int ret = read(fd,pictureBuffer,fileSize);
struct sockaddr_in serverAddr;
serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");
serverAddr.sin_port = htons(8081);
serverAddr.sin_family = AF_INET;
int on = 1;
ret = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
ret = bind(sfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret == -1){
perror("bind");
}
ret = listen(sfd,10);
if(ret == -1){
perror("listen");
}
while(1){
struct sockaddr_in clientAddr;
memset(&clientAddr,0,sizeof(clientAddr));
socklen_t len = sizeof(clientAddr);
int clientfd = accept(sfd,(struct sockaddr*)&clientAddr,&len);
if(clientfd == -1){
perror("accept");
}
const char* startLine = "HTTP/1.1 200 OK\r\n";
const char* headers = "Server: HiaServer\r\n"
"Content-Type: image/jpeg\r\n"
"Content-Length: ";
const char* emptyLine = "\r\n";
sprintf(buffer,"%s%s%ld\r\n%s",
startLine,headers,fileSize,emptyLine);
ret = send(clientfd,buffer,strlen(buffer),0);
send(clientfd,pictureBuffer,fileSize,0);
printf("\nsend %ld bytes\n",fileSize + strlen(buffer));
close(clientfd);
}
close(fd);
close(sfd);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)