【问题标题】:Why i am not able to read multiple strings in the server file?为什么我无法读取服务器文件中的多个字符串?
【发布时间】:2011-12-20 11:49:41
【问题描述】:

在进行客户端-服务器编程时,我在客户端传递了 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);

}

【问题讨论】:

    标签: c client-server


    【解决方案1】:

    在 client.c 主目录中:

        char buf[20][4];
    

    改为:

        char buf[4][20];
    

    在 server.c 中读取字符串:

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

    改为:

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

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

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

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

    您的代码中可能有更多错误,我找到这些后不再查找。

    【讨论】:

      【解决方案2】:

      在 SO 上已经 1 个多小时了,您还没有得到答案.. 似乎是一个非常简单的问题(奇怪的壮举)。你知道为什么吗?

      • 因为浏览您的代码非常痛苦。

        • 记录下来!
        • 将其划分为模块 - init_net()、form_pkt()、 send_pkt(), exit(),.. 等
      • 正确描述您的问题。

        • 您正在运行多少个客户端?
        • 仅打印第一个字符串后会发生什么。你编码停止,永远循环什么?
        • 你看过tcpdump、wireshark等抓包工具吗
      • 在我解决主要问题之前.. 我​​看到诸如“databuf[1024][4]”之类的东西被传递给带有正式参数“char str[3] [20]”的函数 readstr()。

        • 几个建议
          • 通过静态工具分析器运行代码以查找基本警告。
          • 字符串不是在网络上发送的好主意,学习如何定义一个包含包头和数据部分等的数据包结构
          • 另外,我相信您正在寻找类似数据包的通信,而不是基于流的通信。了解其中的区别!

      除非您正确提出,否则我不知道该问题的答案。这一次,每次下一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        相关资源
        最近更新 更多