gpt4 book ai didi

c - 在c中使用套接字发送数据和从套接字发送数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:34 25 4
gpt4 key购买 nike

我正在为学校开发一个程序,但在使用套接字时遇到了一些问题。我在下面粘贴了我程序中的写入和读取命令,因为我认为这些是问题所在。该程序应获取明文文件并使用提供的 key 对其进行加密。

我的问题:当我使用“client [plaintext] [key] [port]”执行程序时,程序返回“Reading data from client -- 140 bytes”然后挂起。我可以按 ctrl-c,程序打印 ptext 和 ktext 的正确输出,并且 37 个字节被发送回客户端(这是正确的字节数)。我觉得加密文本也应该打印出来,但事实并非如此。

两个问题:

1)为什么程序挂了?

2)为什么服务器端好像有数据写到客户端,客户端却没有读到数据?

提前感谢您提供的任何帮助。

客户

n = write(sockfd,ptext,strlen(ptext));

bzero(crypt_text, BUF_MAX);
bzero(buffer, BUF_MAX);

while((n = read(sockfd,buffer,BUF_MAX))>0){
printf("Reading data from Server -- %d bytes\n",n);
strcat(crypt_text, buffer);
bzero(buffer,BUF_MAX);
}
if (n < 0){
error("ERROR reading from socket");
}

printf("%s", crypt_text);

服务器

while((n = read(newsockfd,buffer,512))>0){
printf("Reading data from client -- %d bytes\n",n);
strcat(full_text, buffer);
bzero(buffer,BUF_MAX);
}
if (n < 0){
error("ERROR reading from socket");
}

bzero (ptext,BUF_MAX);
bzero (ktext, BUF_MAX);
strcpy(ptext, strtok(full_text,"["));
strcpy(ktext, strtok(NULL, "["));

printf("ptext length ==%s %d\n\n",ptext,strlen(ptext)); //Prints the correct plain text
printf("ktext length ==%s %d\n\n",ktext,strlen(ktext)); //prints the correct key

crypt_text = encrypt(ptext, ktext);

n = write(newsockfd,crypt_text,strlen(crypt_text));
printf("WRITE TO CILENT ==== %d",n); //This returns the correct number of bytes that should be sent back to client

if (n < 0){
error("ERROR writing to socket");
}

最佳答案

照原样,您的客户端和服务器将始终挂起等待对方。这是因为 read() 默认情况下会阻塞,直到可以从文件(在本例中为套接字)中获取新数据为止。

仔细看代码:

  1. 客户端在进入读循环之前向套接字写入一次
  2. 服务器只从套接字读取(好吧,再往下有一个write(),但它永远不会到达它)。第一次在服务器上运行循环时,它将读取客户端最初写入套接字的数据。
  3. 服务器处理它刚刚读取的数据并将其连接到full_text。然后返回到循环条件,再次调用 read()read() 阻塞,因为此时没有其他内容可从套接字读取。
  4. 客户端进入一个类似的循环,尝试从套接字读取数据,期待来自服务器的消息。
  5. 此时,服务器和客户端都被阻塞等待来自对方的消息,这种情况永远不会发生。

换句话说:您只向套接字写入一次,而您却期望以某种方式多次读取它。

您必须重新考虑您的设计。回到问题描述,按照您的方式完成一个简单的协议(protocol),在纸上试运行,然后实现它 - 这就是它在现实世界中的做法:)

关于c - 在c中使用套接字发送数据和从套接字发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30675569/

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