返回信息流写了一个比较简单的东西,但是出了bind error的错误 求大神指点
#include<iostream>
#include<arpa/inet.h>
#include<cstdio>
#include<cstdlib>
#include<sys/socket.h>
#include<cstring>
#include<unistd.h>
using namespace std;
#define PORT 8080 //服务器监听端口
void errorHandling(const char* message);//错误处理
void requestHandling(void *sock);//处理浏览器请求,参数:客户端套接字地址
void sendData(void*sock,char*filename);//处理浏览器请求的文件,参数:客户端套接字地址,请求文件名
void catHTML(void*sock,char*filename);//读取HTML文件内容发送,参数:客户端套接字地址,文件名
void catJPEG(void*sock,char *filename);//读取JPEG文件内容发送,参数:客户端套接字地址,问价名
void sendError(void* sock);//浏览器请求错误时发送的响应内容,参数:客户端套接字地址
int main(int argc,char**argv)
{
int serv_sock;//保存后面创建的服务器套接字
int clnt_sock;//保存接受请求的客户端套接字
//char buf[1024];//缓冲区
struct sockaddr_in serv_addr;//保存服务器套接字地址信息
struct sockaddr_in clnt_addr;//保存客户端套接字地址信息
socklen_t clnt_addr_size;//客户端套接字地址变量的大小
serv_sock=socket(PF_INET,SOCK_STREAM,0);//创建一个服务器套接字
if(serv_sock==-1)
errorHandling("socket() error");
//配置套接字ip和端口信息,ipv4
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//绑定服务器套接字
if(bind(serv_sock,(const struct sockaddr*)(&serv_addr),sizeof(serv_addr)) ==-1)
errorHandling("bind()error");
//监听服务器套接字
if(listen(serv_sock,5)==-1)
errorHandling("listen() error");
while(1){
//接受客户端的请求
clnt_addr_size=sizeof(clnt_addr);
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
if(-1==clnt_sock)
errorHandling("accept() error");
requestHandling((void*)&clnt_sock);
}
//关闭套接字
close(serv_sock);
return 0;
}
void errorHandling(const char *message)
{
cerr<<message<<endl;
exit(1);
}
void requestHandling(void *sock)
{
int clnt_sock=*((int *)sock);
char buf[1024];//缓冲区
char method[10];//保存请求方法,GET
char filename[20];//保存请求的文件名
//读取浏览器请求内容
read(clnt_sock,buf,sizeof(buf)-1);
//检查请求协议是否正确
if(NULL==strstr(buf,"HTTP/"))
{
sendError(sock);
close(clnt_sock);
return;
}
//提取请求方法至method数组中
strcpy(method,strtok(buf," /"));
//提取请求文件名至filename数组中
strcpy(filename,strtok(NULL," /"));
//判断请求方法是否是GET,不是GET则进行请求错误处理
if(0!=strcmp(method,"GET"))
{
sendError(sock);
close(clnt_sock);
return;
}
//访问请求文件
sendData(sock,filename);
}
void sendData(void*sock,char*filename)
{
int clnt_sock=*((int*)sock);
char buf[20];
char ext[10];
strcpy(buf,filename);
//判断文件类型
strtok(buf,",");
strcpy(ext,strtok(NULL,"."));
if(0==strcmp(ext,"php"))//如果是php文件
{
}
else if(0==strcmp(ext,"html")){//如果是html文件
catHTML(sock,filename);
}else if(0==strcmp(ext,"jpg")){//如果是jpg图片
catJPEG(sock,filename);
}else{
sendError(sock);
close(clnt_sock);
return;
}
}
void catHTML(void*sock,char*filename){
int clnt_sock=*((int *)sock);
char buf[1024];
FILE* fp;
char status[]="HTTP/1.0 200 OK\r\n";
char header[]="Server: A simple Web Server\r\nContent-Type: text/html\r\n\r\n";
//发送响应报文状态行
write(clnt_sock,status,strlen(status));
//发送响应报文消息头
write(clnt_sock,header,strlen(header));
fp=fopen(filename,"r");
if(NULL==fp){
sendError(sock);
close(clnt_sock);
errorHandling("open file failed");
return ;
}
//读取文件内容并发送
fgets(buf,sizeof(buf),fp);
while(!feof(fp))
{
write(clnt_sock,buf,strlen(buf));
fgets(buf,sizeof(buf),fp);
}
fclose(fp);
close(clnt_sock);
}
void catJPEG(void*sock,char* filename){
int clnt_sock=*((int *)sock);
char buf[1024];
FILE* fp;
FILE* fw;
char status[]="HTTP/1.0 200 OK\r\n";
char header[]="Server: A Simple Web Server\r\nContent-Type: image/jpeg\r\n\r\n";
//发送响应报文状态行
write(clnt_sock,status,strlen(status));
//发送响应报文消息头
write(clnt_sock,header,strlen(header));
//图片文件以二进制格式打开
fp=fopen(filename,"rb");
if(NULL==fp){
sendError(sock);
close(clnt_sock);
errorHandling("open file failed!");
return ;
}
//在套接字上打开一个文件句柄
fw=fdopen(clnt_sock,"w");
fread(buf,1,sizeof(buf),fp);
while(!feof(fp)){
fwrite(buf,1,sizeof(buf),fw);
fread(buf,1,sizeof(buf),fp);
}
fclose(fw);
fclose(fp);
close(clnt_sock);
}
void sendError(void *sock){
int clnt_sock=*((int *)sock);
char status[]="HTTP/1.0 400 Bad Request\r\n";
char header[]="Server: A Simple Web Server\r\nContent-Type: text/html\r\n\r\n";
char body[]="<html><head><title>Bad Request</title></head><body><p>请求出错,请检查!</p></body></html>";
//向客户端发送套接字发送消息
write(clnt_sock,status,sizeof(status));
write(clnt_sock,header,sizeof(header));
write(clnt_sock,body,sizeof(body));
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #85855同步于 2015/3/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
socket编程出现bind error
guoxiangonly
2015/3/9镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
#include<iostream>
#include<arpa/inet.h>
#include<cstdio>
#include<cstdlib>
#include<sys/socket.h>
#include<cstring>
#include<unistd.h>
using namespace std;
#define PORT 8080 //服务器监听端口
void errorHandling(const char* message);//错误处理
int main(int argc,char**argv)
{
int serv_sock;//保存后面创建的服务器套接字
int clnt_sock;//保存接受请求的客户端套接字
//char buf[1024];//缓冲区
struct sockaddr_in serv_addr;//保存服务器套接字地址信息
struct sockaddr_in clnt_addr;//保存客户端套接字地址信息
socklen_t clnt_addr_size;//客户端套接字地址变量的大小
serv_sock=socket(PF_INET,SOCK_STREAM,0);//创建一个服务器套接字
if(serv_sock==-1)
errorHandling("socket() error");
//配置套接字ip和端口信息
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//绑定服务器套接字
if(bind(serv_sock,(const struct sockaddr*)(&serv_addr),sizeof(serv_addr)) ==-1)
errorHandling("bind()error");
}
void errorHandling(const char *message)
{
cerr<<message<<endl;
exit(1);
}
然后在绑定服务器套接字处出错了,出现bind()error错误
【 在 nuanyangyang 的大作中提到: 】
: 请简化你的程序,给出一个能够重现你的错误的最短的代码。
【 在 guoxiangonly 的大作中提到: 】
: #include<iostream>
: #include<arpa/inet.h>
: #include<cstdio>
: ...................
用perror函数打印一下错误内容吧。