gpt4 book ai didi

c - 为什么我的 printf 打印出错误的值?

转载 作者:行者123 更新时间:2023-11-30 15:49:45 26 4
gpt4 key购买 nike

我不明白为什么我的代码不起作用。我正在尝试创建类似于 P2P 文件传输的东西,其中多个线程同时从预先存在的服务器程序中获取文件的不同部分。然而,我现在遇到的实际问题要简单得多。

由于无法将多个参数传递到 pthread_create 中,因此我创建了一个结构体,其中包含我想要传递的两条信息。我还创建了一个指向这些结构的指针数组,并在传入其指针之前单独初始化每个指针。

printf("In thread: port=%d & ipAddr=%s\n",conn->port,conn->ipAddr);

当该行运行时,所有内容都会正确打印,并具有正确的端口号和 IP 地址。

printf("Size of chunk %d received by %lu on port %d: %d bytes\n",chunkNum,pthread_self(),conn->port,sizeRec);

但是,当该行不久运行时,端口号无法正确打印出来。我得到的不是 9210 和 9211,而是 0 和 134520848。否则,一切似乎都正常,所以我认为这可能只是某种 printf 问题,但在继续实现下一部分之前我想确定一下我的项目。

如果有人知道为什么同一个变量会在没有进行任何更改的情况下打印出一个值,并且在几行后打印出一个完全不同的值,这对我来说将非常有帮助。我在下面包含了所有代码以供引用。感谢您的帮助!

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

char * file_name = "output.txt";
int nextChunk = 0;

pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;

struct connection{
int port;
char* ipAddr;
};

void* getFile(void* args) {
int con_fd = 0;
int ret = 0;
struct sockaddr_in serv_addr;
struct connection* conn = (struct connection*)args;
printf("In thread: port=%d & ipAddr=%s\n",conn->port,conn->ipAddr);

memset(&serv_addr, 0, sizeof(struct sockaddr));
serv_addr.sin_family = AF_INET;
//printf("port number: %d\n",conn->port);
serv_addr.sin_port = htons(conn->port);
serv_addr.sin_addr.s_addr = inet_addr(conn->ipAddr);
int sizeRec;
char buf[1024];
while(1) {
con_fd = socket(PF_INET, SOCK_STREAM, 0);
if (con_fd == -1) {
printf("Socket Error\n");
fflush(stdout);
return 0;
}
ret = connect(con_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr));
if (ret < 0) {
printf("Connect error\n");
fflush(stdout);
return 0;
}
char chunkStr[128];
pthread_mutex_lock(&lock1);
int chunkNum = nextChunk++;
pthread_mutex_unlock(&lock1);
sprintf(chunkStr,"%d",chunkNum);
send(con_fd,chunkStr,128,0);
sizeRec = recv(con_fd,buf,1024,0);
printf("Size of chunk %d received by %lu on port %d: %d bytes\n",chunkNum,pthread_self(),conn->port,sizeRec);
if (sizeRec <= 0) {
return 0;
}
}
/*FILE *f = fopen(filename, "w");
if (!f) {
printf("Can't open %s for input. Program halting\n",filename);
exit(0);
}*/
/*while ((sizeReceived = recv(sock,buf,1024,0)) > 0) {
if (fwrite(buf,sizeof(char),sizeReceived,f) == -1) {
printf("Error writing file");
exit(0);
}
}
fclose(f);*/
close(con_fd);
return 0;
}

int main(int argc, char ** argv) {

if (argc < 3 || argc % 2 == 0) {
printf("Usage: ./client <ipaddr1> <port1> <ipaddr2> <port2> . . .\n");
return -1;
}
int numThreads = argc / 2;
pthread_t threads[numThreads];
struct connection** connections = malloc(sizeof(struct connection*)*numThreads);
//char* args[numThreads][2];
printf("numThreads: %d\n",numThreads);
for (int i=0; i<numThreads; i++) {
connections[i] = malloc(sizeof(struct connection));
connections[i]->ipAddr = argv[2*i+1];
connections[i]->port = atoi(argv[2*i+2]);
printf("port number: %d\n",connections[i]->port);
pthread_create(&threads[i], NULL, getFile, (void*)(connections[i]));
}
for (int i=0; i<numThreads; i++) {
free(connections[i]);
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock1);
return 0;
}

最佳答案

您的主要问题是 main() 中的第二个 for 循环。

首先释放数据结构,然后调用pthread_join()。颠倒这两个语句,它应该工作可靠。

如果你使用Linux,我建议使用valgrind工具,它可以轻松帮助发现此类问题。对于 Windows,我只知道昂贵的商业工具可以做同样的事情(比如 Purify)。

关于c - 为什么我的 printf 打印出错误的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com