在c语言中使用套接字发送数据
我正在为学校的一个项目工作,在插座方面有一些问题。我已经从下面的程序中粘贴了写和读命令,因为我认为这就是问题所在。程序应该获取明文文件,并使用提供的密钥对其进行加密 我的问题是:当我使用“客户端[明文][键][端口]”执行程序时,程序返回“从客户端读取数据--140字节”,然后挂起。我可以点击ctrl-c,程序会打印ptext和ktext的正确输出,并将37个字节发送回客户端(这是正确的字节数)。我觉得加密的文本也应该打印出来,但它没有 两个问题: 1) 为什么程序挂起 2) 为什么看起来数据是从服务器写入客户机的,而客户机却不读取任何数据 提前感谢您提供的任何帮助 客户在c语言中使用套接字发送数据,c,sockets,C,Sockets,我正在为学校的一个项目工作,在插座方面有一些问题。我已经从下面的程序中粘贴了写和读命令,因为我认为这就是问题所在。程序应该获取明文文件,并使用提供的密钥对其进行加密 我的问题是:当我使用“客户端[明文][键][端口]”执行程序时,程序返回“从客户端读取数据--140字节”,然后挂起。我可以点击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);
n=write(sockfd、ptext、strlen(ptext));
bzero(crypt_text,BUF_MAX);
bzero(缓冲区,BUF_MAX);
而((n=read(sockfd,buffer,BUF_MAX))>0){
printf(“从服务器读取数据--%d字节\n”,n);
strcat(加密文本、缓冲区);
bzero(缓冲区,BUF_MAX);
}
if(n<0){
错误(“从套接字读取错误”);
}
printf(“%s”,加密文本);
服务器
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");
}
while((n=read(newsockfd,buffer,512))>0){
printf(“从客户端读取数据--%d字节\n”,n);
strcat(全文,缓冲区);
bzero(缓冲区,BUF_MAX);
}
if(n<0){
错误(“从套接字读取错误”);
}
bzero(ptext,BUF_MAX);
bzero(ktext,BUF_MAX);
strcpy(ptext,strtok)(全文,“[”);
strcpy(ktext,strtok(NULL,“[”));
printf(“ptext length==%s%d\n\n”,ptext,strlen(ptext));//打印正确的纯文本
printf(“ktext length==%s%d\n\n”,ktext,strlen(ktext));//打印正确的键
crypt_text=加密(ptext,ktext);
n=写入(newsockfd、crypt_text、strlen(crypt_text));
printf(“WRITE TO CILENT==%d”,n);//这将返回应发送回客户端的正确字节数
if(n<0){
错误(“写入套接字时出错”);
}
按原样,您的客户端和服务器将始终挂起等待对方。这是因为默认情况下,read()
会阻塞,直到可以从文件中获取新数据为止(在本例中为套接字)
请仔细查看代码:
write()
,但它永远不会到达它)。循环第一次在服务器上运行时,它将读取客户端最初写入套接字的数据全文
。然后返回循环条件,再次调用read()
。read()
阻塞,因为此时没有其他内容可从套接字读取你必须重新思考你的设计。回到问题描述,通过一个简单的协议,在纸上运行它,然后实现它——这就是它在现实世界中的实现方式:)你的代码中还有其他错误。例如,你写了这样的代码:
strcat(full_text, buffer);
但是buffer
没有NUL终止。n
字节已被读取,缓冲区的其余部分是不确定的。您应该在偏移量n
处设置一个'\0'
字节,并且只尝试读取BUF\u MAX-1
字节,以使一个字节在所有情况下都可用,并执行以下操作:
buffer[n] = '\0';
strcat(full_text, buffer);
此外,您不需要测试全文
中是否有足够的空间,以便n+1
字节strcat
将在末尾复制
另一方面,当服务器接收到数据包时,可以将数据包切成不同大小的块。需要缓冲以确保可靠的客户机/服务器通信。要启用这种缓冲,您需要设计一个协议来确定数据包何时被完全接收:一个简单的协议是传输以b为终端的线路y'\n'
您尝试过调试器吗?“为什么我的程序不工作?”不鼓励这样的问题。要回答2)您的程序正在将数据从服务器读取到缓冲区,它不会直接读取到您的程序。有选项可以“刷新”缓冲区并关闭缓冲。然后您可能会看到您的输出。read()
是阻塞I/O的一部分。IIRC不能像那样使用read()
。它将始终阻塞ie。继续等待客户端再次写入某些内容