这是服务器(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文件)部分的一部分: …
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?
我们来看看这个示例代码:
#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进行比较.
我是对的?
我正在使用 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 …
如果我想要使用包含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文件中?
我有这个简单的代码:
#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(<ime);
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:错误:未知类型名称'天'
考虑这段代码:
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) #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) 这是一个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)