Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代理崩溃_C_Sockets - Fatal编程技术网

C 代理崩溃

C 代理崩溃,c,sockets,C,Sockets,我正在编写一个程序,该程序连接到浏览器,并将http请求从浏览器发送到服务器,然后将响应发送回浏览器,浏览器将加载包含部分内容的页面。我的程序成功发送内容并加载页面,但不会连续运行,并且会在随机时间后崩溃—有时运行10秒,有时运行1分钟。我希望这个代理能够永远运行。下面是我如何构建代码的。我已经包括了recv和write部分,我认为这是造成我全部错误的原因。我对socket编程和c语言基本上都是新手,我正在寻找一些关于我的结构和我可能错过的任何东西的技巧 int main(int argc, c

我正在编写一个程序,该程序连接到浏览器,并将http请求从浏览器发送到服务器,然后将响应发送回浏览器,浏览器将加载包含部分内容的页面。我的程序成功发送内容并加载页面,但不会连续运行,并且会在随机时间后崩溃—有时运行10秒,有时运行1分钟。我希望这个代理能够永远运行。下面是我如何构建代码的。我已经包括了recv和write部分,我认为这是造成我全部错误的原因。我对socket编程和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);