gpt4 book ai didi

c - 为什么我无法读取服务器文件中的多个字符串?

转载 作者:行者123 更新时间:2023-11-30 20:07:40 25 4
gpt4 key购买 nike

在进行客户端-服务器编程时,我在客户端传递了 3 个字符串,这些字符串将由服务器接收,并且应该在其中打印 3 次。 (即我使用了“for”循环,它将分别在客户端和服务器端执行读取和写入操作。),但在服务器中仅打印第一个字符串。

请解释一下,

这是我的代码

server.c

#include "head.h"

void readstr(int connfd ,char [][20]);
//void writestr(char * ,int);

int main(int c ,char *v[])
{
int sd,connfd,retbind;
struct sockaddr_in serveraddress ,cliaddr;
socklen_t len;
char buf[100] ,databuf[1024][4];
sd =socket( AF_INET ,SOCK_STREAM ,0);
if (sd<0)
{

exit(1);
}
memset(&serveraddress ,0 ,sizeof(serveraddress));
serveraddress.sin_family =AF_INET;
serveraddress.sin_port =htons(MYPORT);
serveraddress.sin_addr.s_addr =htonl(INADDR_ANY);
retbind =bind(sd ,(struct sockaddr*)&serveraddress ,sizeof(serveraddress
));
if(-1 ==retbind)
{
perror("bind fails ");
exit(0);
}
listen(sd ,4);
for(;;)
{
printf("i am waiting for client\n");
len =sizeof(cliaddr);
connfd = accept(sd ,(struct sockaddr*)&cliaddr ,&len);
if(connfd <0)
{
if(errno ==EINTR)
printf("interrupt");
continue;
}
printf("connection from %s\n",inet_ntop(AF_INET ,&cliaddr.sin_addr,buf ,
sizeof(buf)));
readstr(connfd ,databuf);
close(connfd);
printf("\n fini one clieni");
}
return 0;
}

void readstr(int connfd ,char str[3] [20])
{
int pointer=0 ,i=0, n,pos=0;
memset(str ,'\0',sizeof(str));
printf("\n->Connfd : %d\n",connfd);
printf("\n----->String recieved : %s\n",str);
for(i=0;i<3;i++)
{
while((n=read(connfd ,str[i] ,20)) >>0)
{
printf("Looping while\n");
pos =pos +n;

}
str[i][pos] ='\0';
}
for(i=0;i<3;i++)
{
printf("\n%s",str[i]);
}
}

client.c

#include "head.h"
void send1(int ,char*);

int main(int c,char*v[])
{
int sd,i;
int len;
char buf[20][4];
struct sockaddr_in serveraddress;
sd = socket(AF_INET ,SOCK_STREAM ,0);
if (sd<0)
perror("socket");
memset(&serveraddress ,0 ,sizeof(serveraddress));
serveraddress.sin_family =AF_INET;
serveraddress.sin_port =htons(atoi(v[1]));
serveraddress.sin_addr.s_addr =inet_addr(v[2]);

if(connect(sd,(struct sockaddr*)&serveraddress ,sizeof(serveraddress)) <
0)

{
printf("cannot connect to server");
exit(1);
}
for(i=0;i<3;i++)
{
memset(buf ,'\0',sizeof(buf));
printf("\n string");
fgets(buf[i],20,stdin);
len =strlen(buf[i]);
if(buf[i][len] =='\n')
buf[i][len]='\0';

// scanf("%s",buf[i]);
send1(sd ,(char *)buf);
}
shutdown(sd ,SHUT_WR);
}

void send1(int sd ,char *str)
{

int n ,byteswritten =0, wr;
char buf[1024];
strcpy(buf ,str);
n =strlen(buf);
while(byteswritten < n)
{
printf("\nStart writing in client side\n");
wr = write(sd , buf+byteswritten ,(n-byteswritten));
byteswritten+=wr;
}
printf("\n string sent %s" ,buf);

}

最佳答案

在client.c main中:

    char buf[20][4];

更改为:

    char buf[4][20];

在server.c中读取str:

    while((n=read(connfd ,str[i] ,20)) >>0)

更改为:

    while((n = read(connfd, &str[i][pos], 20)) > 0)

pos 需要在 for 循环内重置为 0。

此外,客户端从 stdin 读取 3 个字符串,每个字符串最多 20 个字符,并将它们写入套接字。服务器需要 3 个字符串,每个字符串正好有 20 个字符。

您应该在网络协议(protocol)中使用某种记录分隔符,例如\n,或者使用固定长度,即将输入字符串填充为 20 个字符。

您的代码中可能还有更多错误,找到这些错误后我就停止查找了。

关于c - 为什么我无法读取服务器文件中的多个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8574952/

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