在c语言中使用套接字发送数据

在c语言中使用套接字发送数据,c,sockets,C,Sockets,我正在为学校的一个项目工作,在插座方面有一些问题。我已经从下面的程序中粘贴了写和读命令,因为我认为这就是问题所在。程序应该获取明文文件,并使用提供的密钥对其进行加密 我的问题是:当我使用“客户端[明文][键][端口]”执行程序时,程序返回“从客户端读取数据--140字节”,然后挂起。我可以点击ctrl-c,程序会打印ptext和ktext的正确输出,并将37个字节发送回客户端(这是正确的字节数)。我觉得加密的文本也应该打印出来,但它没有 两个问题: 1) 为什么程序挂起 2) 为什么看起来数据是

我正在为学校的一个项目工作,在插座方面有一些问题。我已经从下面的程序中粘贴了写和读命令,因为我认为这就是问题所在。程序应该获取明文文件,并使用提供的密钥对其进行加密

我的问题是:当我使用“客户端[明文][键][端口]”执行程序时,程序返回“从客户端读取数据--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()
    阻塞,因为此时没有其他内容可从套接字读取
  • 客户机进入一个类似的循环,在该循环中,它尝试从套接字读取消息,期望从服务器收到消息
  • 此时,服务器和客户端都被阻止等待对方的消息,这是永远不会发生的
  • Tu用另一种方式说:您只向套接字写入了一次,但不知怎的,您希望多次读取它


    你必须重新思考你的设计。回到问题描述,通过一个简单的协议,在纸上运行它,然后实现它——这就是它在现实世界中的实现方式:)

    你的代码中还有其他错误。例如,你写了这样的代码:

     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。继续等待客户端再次写入某些内容