gpt4 book ai didi

c - 从c中连接的udp套接字中读取返回

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

我编程UDP客户端/服务器模型,此应用程序的主要功能是客户端插入目录路径,然后服务器将向客户端重新运行提供的目录内容,因此此客户端代码:

#include "cliHeader_UDP.h"

int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;

/*Error checking for providing appropirate port# */
if(argc<3 )
err_quit("Error,no port provided, please enter the port#:22011 \n");

portno=atoi(argv[2]);


for(;;)
{
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(portno);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));
}
exit(0);
}

**//and here is the dg_cli implemntation :**


void
dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];

Connect(sockfd, (SA *) pservaddr, servlen);
for(;;)
{
bzero(&sendline, sizeof(sendline));
printf("please enter Directory Name :\n");
Fgets(sendline, MAXLINE, fp);

/*To check if the supplied name ended with \n in sendline buffer */
if((p = strchr(sendline, '\n'))) *p = 0;

write(sockfd, sendline, strlen(sendline));
printf("test for write\n");
**Line 31.......:** while ( (n=read(sockfd, recvline, MAXLINE)) )
{
if(n<0)
perror("Error");

printf("recvline is: %s\n",recvline);
printf("n========%d\n",n);



}
printf("exit from read While\n");
recvline[n] = 0; /* null terminate */



}
}

第 31 行中的问题...是第一次运行,因为我希望客户端插入 DIR 路径,因此服务器将返回路径的内容,但是当用户需要再次插入路径时,它仍然在 for 循环中阻塞读取并且不会从 for 循环返回,那么当缓冲区的内容结束从for循环返回时如何设置条件,就像TCP中的EOF

最佳答案

正如您所注意到的,UDP 中没有“连接”的概念 - 即使您调用 connect(2) - 因此 read 无法返回 0 通信结束。有一些方法可以解决这个问题:

  • 让服务器在输出结束时发送一条 0 长度的消息或其他特殊标记
  • 让客户端分析输入并以某种方式检测它是否结束

这两种方法在实践中都有点脆弱:想象一下如果“输出结束”消息出现很多会发生什么。因此,您还必须针对这种情况进行配置,并可能添加超时(例如,查找 SO_RCVTIMEO)。

关于c - 从c中连接的udp套接字中读取返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934710/

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