Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
_popen崩溃[Windows-C]_C_Windows_Sockets_Popen - Fatal编程技术网

_popen崩溃[Windows-C]

_popen崩溃[Windows-C],c,windows,sockets,popen,C,Windows,Sockets,Popen,我是C语言的新手(事实上是所有编译语言的新手),下面你会看到我的可怕代码,我试图接收命令,然后我希望执行它(尚未实现) 我在_popen函数上绘制了来自微软的示例代码,并对其进行了修改(非常轻微),但由于某种原因,在收到命令后,我的程序崩溃了。如果我将这段代码移到命令接收器部分之上,它就可以正常工作。我是在重写另一个内存地址还是什么 如果您需要服务器(用python编写),请告诉我。希望你能帮助有需要的人 #include <winsock2.h> #include <stdi

我是C语言的新手(事实上是所有编译语言的新手),下面你会看到我的可怕代码,我试图接收命令,然后我希望执行它(尚未实现)

我在_popen函数上绘制了来自微软的示例代码,并对其进行了修改(非常轻微),但由于某种原因,在收到命令后,我的程序崩溃了。如果我将这段代码移到命令接收器部分之上,它就可以正常工作。我是在重写另一个内存地址还是什么

如果您需要服务器(用python编写),请告诉我。希望你能帮助有需要的人

#include <winsock2.h>
#include <stdio.h>
#include <windows.h>

int sendall(int sock, char *message, unsigned int size);
int connect(char address[], short port);
char* recvall(int sock, unsigned int *msgsize);


int main(){
    char address[] = "127.0.0.1";
    short port = 1234;
    int wait = 5000;

    //Connect back
    int sock = 1;
    printf("Connecting...\n");
    sock = connect(address, port);
    while(sock == 1){
        WSACleanup();
        Sleep(wait);
        sock = connect(address, port);
    }

    printf("Succesfully conneted\n");

    char test[] = "ABCDEFGH";
    sendall(sock,test, 8);

    unsigned int msgsize;
    char *msg = recvall(sock,&msgsize);


    printf("%s\n", msg);
    printf("%d\n", msgsize);


    //RUN COMMAND

    char   psBuffer[128];
    FILE   *pPipe;


    printf("There\n");

    if( (pPipe = _popen( "ipconfig", "rt" )) == NULL )
        exit( 1 );

    printf("Out\n");

    while(fgets(psBuffer, 128, pPipe)){
        printf(psBuffer);
    }


    if (feof( pPipe)){
        printf( "\nProcess returned %d\n", _pclose( pPipe ) );
    }else{
        printf( "Error: Failed to read the pipe to the end.\n");
    }

    //RUN COMMAND END 

    Sleep(10000);
    return 0;
}

int sendall(int sock, char *message, unsigned int size){

    //Send size packet
    char sizepacket[12];
    sprintf (sizepacket, "%012u",size);
    send(sock, sizepacket, 12, 0);

    //Send data
    unsigned int left = size;
    unsigned int offset = 0;
    while(left>0){
        if(left<1024){
            send(sock, (message+offset), left, 0);
            left = 0;
        }else{
            send(sock, (message+offset), 1024, 0);
            offset = offset + 1024;
            left = left - 1024;
        }
    }
    return 0;
}

char* recvall(int sock, unsigned int *size){
    char *message;

    //Get size packet
    char sizebuff[24];
    memset (&sizebuff,0,24);
    recv(sock, sizebuff, 12, 0);
    *size = atoi(sizebuff);

    //Alloc space for message
    message = (char*)  malloc(*size + 1);
    memset(message,0,1024);

    //Get data
    unsigned int left = *size;
    unsigned int offset = 0;
    while(left>0){
        if(left<1024){
            recv(sock, (message+offset), left, 0);
            left = 0;
        }else{
            recv(sock, (message+offset), 1024, 0);
            offset = offset + 1024;
            left = left - 1024;
        }
    }
    return message;
}



int connect(char address[], short port){
    int returnvalue;

    WSADATA wsaData;

    returnvalue = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(returnvalue != 0){
        return 1;
    }

    int sock;
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == 0){
        return 1;
    }


    //Create struct
    struct sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr(address);
    clientService.sin_port = htons(port);


    returnvalue = connect(sock, (SOCKADDR*) &clientService, sizeof(clientService));
    if (returnvalue != 0){
        closesocket(sock);
        WSACleanup();
        return 1;
    }

    return sock;
}
#包括
#包括
#包括
int sendall(int sock、char*消息、无符号int大小);
int connect(字符地址[],短端口);
char*recvall(int sock,unsigned int*msgsize);
int main(){
字符地址[]=“127.0.0.1”;
短端口=1234;
int wait=5000;
//回接
int sock=1;
printf(“连接…\n”);
sock=连接(地址、端口);
while(sock==1){
WSACleanup();
睡眠(等待);
sock=连接(地址、端口);
}
printf(“成功连接\n”);
字符测试[]=“ABCDEFGH”;
sendall(短袜,测试,8);
无符号整数msgsize;
char*msg=recvall(sock和msgsize);
printf(“%s\n”,msg);
printf(“%d\n”,msgsize);
//运行命令
字符psBuffer[128];
文件*pPipe;
printf(“There\n”);
if((pPipe=\u popen(“ipconfig”,“rt”))==NULL)
出口(1);
printf(“Out\n”);
而(fgets(psBuffer,128,pPipe)){
printf(psBuffer);
}
if(feof(pPipe)){
printf(“\n进程返回%d\n”,\u pclose(pPipe));
}否则{
printf(“错误:无法将管道读取到底。\n”);
}
//运行命令结束
睡眠(10000);
返回0;
}
int sendall(int sock、char*消息、未签名的int大小){
//发送大小数据包
炭粒包装[12];
sprintf(尺寸包,“%012u”,尺寸);
发送(袜子,尺寸包,12,0);
//发送数据
无符号整数左=大小;
无符号整数偏移量=0;
而(左>0){
如果(左0){

如果(左您的示例无法在我的系统上编译,因为您有两个版本的
connect()
函数——您的本地调用和系统版本,在这一行从本地
connect()
函数本身调用:

returnvalue = connect(sock, (SOCKADDR*) &clientService, sizeof(clientService));

尝试将您的本地版本更改为其他名称,例如
xconnect()
。我很惊讶您的编译器允许这样做。

您的popen似乎不依赖于套接字通信

请描述服务器发送的消息(hextump?)

请查看您的recvall()函数。您从套接字读取12个字节,将其转换为int,并将大量字节malloc,存储到*size中,然后将消息缓冲区(仅malloc'ed)设置为1024大小。然后,您将消息接收到缓冲区中,但不设置任何保护,以确保不会超出消息[*size]的结尾

int main(){
    //...
    unsigned int msgsize;
    char *msg = recvall(sock,&msgsize);
    printf("%d\n", msgsize);
    printf("%s\n", msg);
    return 0;
}

char* recvall(int sock, unsigned int *size){
    char *message;
    //Get size packet
    char sizebuff[24];
    memset (&sizebuff,0,24);
    recv(sock, sizebuff, 12, 0);
    *size = atoi(sizebuff);
    printf("size: %d\n",*size);fflush(stdout);
    //Alloc space for message
    message = (char*)  malloc(*size + 1);
    memset(message,0,1024); //why 1024? why not *size?
    //Get data
    unsigned int left = *size;
    unsigned int offset = 0;
    while(left>0){
        if(left<1024){
            recv(sock, (message+offset), left, 0);
            left = 0;
        }else{
            recv(sock, (message+offset), 1024, 0); //why 1024?
            offset = offset + 1024; //again, why 1024?, this is > 1024
            left = left - 1024;
        }
    }
    return message;
}
intmain(){
//...
无符号整数msgsize;
char*msg=recvall(sock和msgsize);
printf(“%d\n”,msgsize);
printf(“%s\n”,msg);
返回0;
}
char*recvall(int sock,unsigned int*size){
字符*消息;
//获取大小数据包
char-sizebuff[24];
memset(&sizebuff,0,24);
recv(sock,sizebuff,12,0);
*尺寸=atoi(sizebuff);
printf(“大小:%d\n”,*大小);fflush(标准输出);
//消息分配空间
消息=(字符*)malloc(*大小+1);
memset(message,01024);//为什么是1024?为什么不是*大小?
//获取数据
无符号整数左=*大小;
无符号整数偏移量=0;
而(左>0){
如果(左)1024
左=左-1024;
}
}
返回消息;
}

<代码>虽然它被标记为C,但是OP可能编译程序为C++,在这种情况下这不会是一个问题(两个连接函数有不同的签名)。@威尔金斯-谢谢。你可能是对的。我想过,但是我没有看到代码中有任何“这是显而易见的C++”语法,加上声称使用C的OP。(虽然是公认的新手)。我觉得自己太傻了……我想第一步就是吮吸东西。你在前1024个方面是对的——最后一个是因为我收到了1024字节的信息,但它现在编译得非常完美。非常感谢!