C 代理崩溃
我正在编写一个程序,该程序连接到浏览器,并将http请求从浏览器发送到服务器,然后将响应发送回浏览器,浏览器将加载包含部分内容的页面。我的程序成功发送内容并加载页面,但不会连续运行,并且会在随机时间后崩溃—有时运行10秒,有时运行1分钟。我希望这个代理能够永远运行。下面是我如何构建代码的。我已经包括了recv和write部分,我认为这是造成我全部错误的原因。我对socket编程和c语言基本上都是新手,我正在寻找一些关于我的结构和我可能错过的任何东西的技巧C 代理崩溃,c,sockets,C,Sockets,我正在编写一个程序,该程序连接到浏览器,并将http请求从浏览器发送到服务器,然后将响应发送回浏览器,浏览器将加载包含部分内容的页面。我的程序成功发送内容并加载页面,但不会连续运行,并且会在随机时间后崩溃—有时运行10秒,有时运行1分钟。我希望这个代理能够永远运行。下面是我如何构建代码的。我已经包括了recv和write部分,我认为这是造成我全部错误的原因。我对socket编程和c语言基本上都是新手,我正在寻找一些关于我的结构和我可能错过的任何东西的技巧 int main(int argc, c
int main(int argc, char *argv[])
{
char ip[40]
char *host = argv[1];
char *port_s = argv[2];
int err;
int socket_browser, socket_newBrowser, c;
struct sockaddr_in server, client;
int n;
socket_browser= socket(AF_INET, SOCK_STREAM, 0);
if (socket_browser < 0)
{
printf("Could not create socket");
}
if (err = bind(socket_browser , (struct sockaddr *)&server, sizeof(server)) != 0)
{
resourceError(err, "bind");
return 1;
}
if (err = listen(socket_browser , 3) != 0)
{
resourceError(err, "listen");
}
while (1){
c = sizeof(struct sockaddr_in);
server_socket= accept(socket_browser, (struct sockaddr *)&client, (socklen_t *)&c);
char buf[256];
int n;
n = recv(socket_newBrowser, buf, 256, 0);
if (n < 0){
resourceError(n,"recv");
}
int server_socket;
struct sockaddr_in server2;
server_socket= socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0)
{
resourceError(server_socket, "serverSocket");
}
server2.sin_addr.s_addr = inet_addr(ip);
server2.sin_family = AF_INET;
server2.sin_port = htons(80);
connect(server_socket, (struct sockaddr *)&server2, sizeof(server2))
send(server_socket, buf, strlen(buf), 0);
char reply[256];
int bytes_reply = 0;
do
{
bytes_reply = recv(server_socket, reply, sizeof(reply), 0);
// Need to check for double enter as this currently does not work in telnet
if (bytes_reply == -1)
{
perror("Recv error");
}
else
{
write(server_socket, reply, bytes_reply);
}
} while (bytes_reply > 0);
printf("connections closed");
}
return 0;
}
intmain(intargc,char*argv[])
{
char ip[40]
char*host=argv[1];
char*port_s=argv[2];
INTERR;
int socket_浏览器,socket_newBrowser,c;
服务器、客户端中的结构sockaddr_;
int n;
socket\u browser=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字浏览器<0)
{
printf(“无法创建套接字”);
}
如果(err=bind(socket\u浏览器,(struct sockaddr*)和服务器,sizeof(服务器))!=0)
{
资源错误(err,“bind”);
返回1;
}
if(err=listen(socket\u浏览器,3)!=0)
{
资源错误(err,“listen”);
}
而(1){
c=sizeof(结构sockaddr_in);
服务器\u套接字=接受(套接字浏览器,(结构sockaddr*)和客户端,(socklen\u t*)和c);
char-buf[256];
int n;
n=recv(插座新浏览器,buf,256,0);
if(n<0){
资源错误(n,“recv”);
}
int-server_-socket;
server2中的结构sockaddr_;
服务器\u套接字=套接字(AF\u INET,SOCK\u STREAM,0);
如果(服务器\u套接字<0)
{
resourceError(服务器套接字,“服务器套接字”);
}
server2.sin\u addr.s\u addr=inet\u addr(ip);
server2.sinu family=AF\u INET;
server2.sinu端口=htons(80);
连接(服务器\u套接字,(结构sockaddr*)和服务器2,sizeof(服务器2))
发送(服务器_套接字,buf,strlen(buf),0);
字符回复[256];
int bytes_reply=0;
做
{
bytes_reply=recv(服务器_套接字,reply,sizeof(reply),0);
//需要检查双输入,因为这在telnet中当前不起作用
如果(字节数_回复==-1)
{
perror(“Recv错误”);
}
其他的
{
写入(服务器\u套接字、应答、字节\u应答);
}
}while(bytes_reply>0);
printf(“连接关闭”);
}
返回0;
}
我认为您的问题(或至少是一个问题)是:
buf
不是以null结尾的,您应该使用从recv返回的n
值,而不是strlen
使用调试器。它可以立即告诉您触发seg故障的确切代码行。请发布最少的调试信息。可能它的套接字用完了?while(1)
循环不会关闭socket\u newBrowser
或server\u socket
,也不会检查accept
调用和socket
调用的结果。(另外,new_socket
定义在哪里?@kaylum firefox告诉我-暂停在异常语法错误:“*,:x”不是有效的选择器或服务器要绑定到哪个端口?您将一个统一化的服务器
变量传递给绑定
@IanAbbott,在哪里可以关闭两个套接字?
n = recv(socket_newBrowser, buf, 256, 0);
/*versus*/
send(server_socket, buf, strlen(buf), 0);