gpt4 book ai didi

sockets - 在套接字描述符上读/写linux c

转载 作者:行者123 更新时间:2023-12-03 12:01:14 24 4
gpt4 key购买 nike

我正在尝试将文件的内容从服务器发送到客户端,我正在使用fgets逐行读取文件,并在客户端逐行写入套接字描述符,我处于while循环中,读取发送的内容。我无法终止服务器的发送顺序,即客户端继续读取缓冲区并且下一个程序行没有执行,我认为我的发送或接收方式出了问题。这是代码:

server :
filefd = fopen("clients.txt","a+");
while(fgets(filcont,300,filefd) != NULL)
{// write whole file contents to client
n=write(newsockfd,filcont,strlen(filcont));
if(n==0) break;
memset(filcont,'\0',300);
}
fclose(filefd);


client side :
while(n>0){
n = read(sockfd,buffer,sizeof(buffer)-1);
if(n==0) break;
printf("%s\nbytes read :%d \n",buffer,n);
memset(buffer,'\0',256);
}

printf(“输入对等名称(您的除外)以发送连接请求:\n”);
上一行(printf,对等名称在我终止服务器之前不会执行)

最佳答案

我能够弄清楚,我使用fread而不是fgets(逐行)从服务器发送了文件内容,并在客户端使用了一个read()。这是快速解决方案。
但是我还想出了另一种技术,以防万一您必须强制使用fgets时,客户端的while循环使套接字非阻塞以便读取然后再次阻塞,然后将代码粘贴到下面。

flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
while(n>0){
n = read(sockfd,buffer,sizeof(buffer)-1);
if(n==0) break;
if(n==-1) printf("\nNon blocking read failed congrats");
printf("%s\n",buffer);
memset(buffer,'\0',256);
}
printf("\nbytes read :%d \n",n);
val = fcntl(sockfd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags; // makes it blocking again
fcntl(sockfd,F_SETFL,val);

引用了来自stackoverflow的代码以使套接字阻塞

关于sockets - 在套接字描述符上读/写linux c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934370/

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