小编pol*_*nux的帖子

c发送和接收文件

这是服务器(sendfile)部分:

offset = 0;
for (size_to_send = fsize; size_to_send > 0; ){
  rc = sendfile(newsockd, fd, &offset, size_to_send);
  if (rc <= 0){
    perror("sendfile");
    onexit(newsockd, sockd, fd, 3);
  }
  offset += rc;
  size_to_send -= rc;
}
close(fd); /* la chiusura del file va qui altrimenti rischio loop infinito e scrittura all'interno del file */

memset(buffer, 0, sizeof(buffer));
strcpy(buffer, "226 File Successfully transfered\n");
if(send(newsockd, buffer, strlen(buffer), 0) < 0){
  perror("Errore durante l'invio 226");
  onexit(newsockd, sockd, 0, 2);
}
memset(buffer, 0, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)

这是客户端(recv文件)部分的一部分: …

c sockets sendfile

12
推荐指数
1
解决办法
7万
查看次数

C size_t和ssize_t负值

size_t被声明为unsigned int不能代表负值.
那么有ssize_t哪些是签名类型的size_t权利?
这是我的问题:

#include <stdio.h>
#include <sys/types.h>

int main(){
size_t a = -25;
ssize_t b = -30;
printf("%zu\n%zu\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我得到:

18446744073709551591
18446744073709551586
Run Code Online (Sandbox Code Playgroud)

结果?
我知道size_t这可能是因为它是一个无符号类型,但为什么我得到了错误的结果ssize_t

c size-t

11
推荐指数
1
解决办法
1万
查看次数

指针和演员

我们来看看这个示例代码:

#include <stdio.h>

int main(void){
    int x = 1;
    if(*(char *)&x == 1) printf("little-endian\n");
    else printf("big-endian\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已多次看过这个(或类似的)指令*(char *)&x,现在我想完全理解它是什么意思!
我认为这意味着:
1)获取int变量的地址
2)然后将其转换为char指针
3)然后将"new char pointer"的第一个元素与数字1进行比较.

我是对的?

c pointers

7
推荐指数
1
解决办法
175
查看次数

aes-gcm 在 C 中使用 libgcrypt api

我正在使用 libgcrypt(Gentoo x64 上的 v1.6.1)并且我已经实现(并通过 AEs 测试向量进行了测试)aes256-cbc 和 aes256-ctr。现在我正在查看 aes256-gcm,但我对工作流程有一些疑问。下面是一个简单加密程序的骨架:

int main(void){

    unsigned char TEST_KEY[] = {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4};
    unsigned char TEST_IV[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
    unsigned char TEST_PLAINTEXT_1[] = {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a};

    unsigned char cipher[16] = {0};

    int algo = -1, i;
    const char *name = "aes256";

    algo = gcry_cipher_map_name(name);

    gcry_cipher_hd_t hd;
    gcry_cipher_open(&hd, algo, GCRY_CIPHER_MODE_GCM, 0);
    gcry_cipher_setkey(hd, TEST_KEY, 32);
    gcry_cipher_setiv(hd, TEST_IV, 16);

    gcry_cipher_encrypt(hd, cipher, 16, TEST_PLAINTEXT_1, 16);
    char out[33];
    for(i=0;i<16;i++){
        sprintf(out+(i*2), "%02x", cipher[i]);
    }
    out[32] = '\0';
    printf("%s\n", out);

    gcry_cipher_close(hd);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 GCM …

c aes-gcm libgcrypt

6
推荐指数
1
解决办法
1608
查看次数

如何以及在何处在头文件中包含stdint.h类型定义?

如果我想要使用包含proto.h的所有*.c文件int32_t而不是将int其写入名为的头文件中是否正确proto.h:

#ifndef PROTO_H_INCLUDED
#define PROTO_H_INCLUDED
#ifndef STDINT_H_INCLUDED
#define STDINT_H_INCLUDED
typedef int int32_t;
typedef unsigned int uint32_t;
typedef size_t uint32_t;
#endif
Run Code Online (Sandbox Code Playgroud)

然后将proto.h包含在需要它的所有*.c文件中typedef

或者我应该将stdint.h包含在我的所有*.c文件中?

c header

5
推荐指数
1
解决办法
3万
查看次数

C enum:未知类型名称

我有这个简单的代码:

#include <stdio.h>
#include <time.h>

int main(){
    enum Days { asd=0,Lun,Mar,Mer,Gio,Ven,Sab,Dom };
    Days TheDay;
    time_t ltime;
    struct tm *Tm;

    ltime=time(NULL);
    Tm=localtime(&ltime);
    int j = Tm->tm_wday;
    TheDay = Days(j);

    printf("[%d] %d/%d/%d, %d:%d:%d\n",
            TheDay, /* Mon - Sun */
            Tm->tm_mday,
            Tm->tm_mon,
            Tm->tm_year+1900,
            Tm->tm_hour,
            Tm->tm_min,
            Tm->tm_sec);
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我收到这个错误:

try.c:6:5:错误:未知类型名称'天'

c enums

5
推荐指数
1
解决办法
1万
查看次数

C多次打开文件

我有一个打开的文件fopen.有一种方法可以重新打开同一个文件(当它打开时),但有不同的搜索?(所以我可以独立使用fread)

c fopen

5
推荐指数
1
解决办法
1万
查看次数

退出子进程(c)

考虑这段代码:

void do_child(void);

int main(void){
int n;
pid_t child;
printf("Write a number: ");
scanf("%d", &n);
if(n != 1){
exit(1);
}
child = fork();
if(child >= 0){ /* fork ok */
 if(child == 0){
    printf("Child pid: %d\n", getpid());
    do_child();
    _exit(0);
  }
 else{ /* parent */
    printf("Child parent: %d\n", getpid());
    _exit(0);
 }
}
else{ /* fallito */
    perror("No fork");
    return 1;
}
return EXIT_SUCCESS;
}

void do_child(void){
/* some code here */
if(1 != 1){
    /* what to write here?? _exit or …
Run Code Online (Sandbox Code Playgroud)

c fork

4
推荐指数
1
解决办法
1万
查看次数

检查返回值 fread 和 fwrite

#include <stdio.h>\n#include <stdlib.h>\n\nint main(int argc, char *argv[]){\n\n  if(argc != 3){\n    printf("Usage: ./copy filename newfile\\n");\n    exit(1);\n  }\n\n  int bytes;\n  long file_size, file_copied_size;\n  FILE *file_to_copy, *new_file;\n\n  if((file_to_copy = fopen(argv[1], "rb")) == NULL){\n    printf("File cannot be opened - read\\n");\n    exit(1);\n  }\n  if((new_file = fopen(argv[2], "wb")) == NULL){\n    printf("File cannot be opened - write\\n");\n    exit(1);\n  }\n\n  fseek(file_to_copy, 0, SEEK_END);\n  file_size = ftell(file_to_copy);\n  rewind(file_to_copy);\n\n  char *buffer = malloc(1024 * 1024); /* Imposto un buffer di 1MB per maggiore efficienza */ \n  if(!buffer){\n    printf("Errore allocazione memoria\\n");\n …
Run Code Online (Sandbox Code Playgroud)

c return-value fwrite fread

2
推荐指数
1
解决办法
2万
查看次数

while循环不会退出C.

这是一个while循环工作片段:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
        if(total_bytes_read == fsize) break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个while循环的非工作片段的示例:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,这是一个while循环的非工作片段的示例:

while(total_bytes_read < fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd); …
Run Code Online (Sandbox Code Playgroud)

c while-loop

2
推荐指数
1
解决办法
1705
查看次数

标签 统计

c ×10

aes-gcm ×1

enums ×1

fopen ×1

fork ×1

fread ×1

fwrite ×1

header ×1

libgcrypt ×1

pointers ×1

return-value ×1

sendfile ×1

size-t ×1

sockets ×1

while-loop ×1