免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7463 | 回复: 20
打印 上一主题 下一主题

为什么只能从socket中读出1460个字节 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-13 18:31 |只看该作者 |倒序浏览
我刚做一个与财政局通信的client端程序(简单测试),很奇怪每次只能从socket中读1460个字节,不知何解,望高手指点!
    程序如下:
#define   MAXDATASIZE 500
#define   TCP_PORT    7000
#define   TCP_ADDR    10.1.1.1

int connect_sev( int *rec_sockfd )        /*与服务器建立连接*/
{
        int sockfd;
        struct        sockaddr_in        server_add;

        if ( (sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ){
                return -1;
        }
        server_add.sin_family = AF_INET;
        server_add.sin_port = htons( TCP_PORT );
        server_add.sin_addr.s_addr = inet_addr( TCP_ADDR ) ;
        if ( connect( sockfd, ( struct  sockaddr * ) & server_add, sizeof(struct sockaddr ) )<0 )
        {
                return -1;
        }
        * rec_sockfd = sockfd ;

        return 0;
}

/*        client端        */
int main( )
{
        char        send_buff[1024];
        char        recv_buff[1024];
        int        sockfd;
        int        rec;
        long        number;
        char        filename[201];

        FILE        *fp;

        rec=0;
        memset( send_buff, 0x00, sizeof(send_buff) );
        memset( recv_buff, 0x00, sizeof(recv_buff) );
        memset( filename, 0x00, sizeof(filename) );

        sprintf(filename,"%s/test.txt",getenv("TMPDIR" );

        rec = connect_sev( &sockfd );
        if( rec ) {
                return -1;
        }
        if(!( fp = fopen( filename,"w" )) {
                close( sockfd );
                return -1;
        }

        strcpy( send_buff, "1011" );        /*发送命令指令*/
        number = send( sockfd, send_buff, strlen(send_buff), 0 );
        if (number < 0) {
                close( sockfd );
                fclose( fp );
                return -1;
        }
        while (1) {
                memset( recv_buff, 0x00, sizeof(recv_buff) );
                number = recv( sockfd, recv_buff,MAXDATASIZE, 0 );
                recv_buff[number] = '\0';
                if (number == 0)
                        break;
                fprintf( fp, recv_buff );
                if (number < MAXDATASIZE)
                        break;
        }

        close( sockfd );
        fclose( fp );
       
    return 0;
}


分析:
1。可能是服务器方程序有问题(可惜已经下班),估计可能性不大,因为还有其他单位测试,没有这种反映。
2。connect()、socket()、send()、recv()等函数会不会有些参数不正确?

望各位大侠指点!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-06-13 18:34 |只看该作者

为什么只能从socket中读出1460个字节

recv返回正常么?最好判断一下recv的返回值,有可能是-1。

如果没问题用sniffer,看看传送过程

论坛徽章:
0
3 [报告]
发表于 2003-06-13 18:35 |只看该作者

为什么只能从socket中读出1460个字节

与参数无关,
改一下代码,太乱了,没法看

论坛徽章:
0
4 [报告]
发表于 2003-06-13 18:42 |只看该作者

为什么只能从socket中读出1460个字节

char recv_buff[1024];

论坛徽章:
0
5 [报告]
发表于 2003-06-13 18:43 |只看该作者

为什么只能从socket中读出1460个字节

最后一次循环recv的返回值是460,是正常值(每次读500字节),recv_buff的内容也正常。

论坛徽章:
0
6 [报告]
发表于 2003-06-13 18:46 |只看该作者

为什么只能从socket中读出1460个字节

网络不稳定时或包太大会有这种情况, 你的程序不是很好。使用readn吧。

论坛徽章:
0
7 [报告]
发表于 2003-06-13 19:30 |只看该作者

为什么只能从socket中读出1460个字节

刚才经过反复测试,发现MAXDATASIZE的值在30以内就能将数据全部读出来(问题解决),35都不正常,从socket读出的总字节数又会多一些,但还是不完全。太小(比如5)也不正常。奇怪,一般MAXDATASIZE值都可以设成100以上的,有谁能解释这种现象?可能真的同那几个函数参数设置有关?

论坛徽章:
0
8 [报告]
发表于 2003-06-13 21:18 |只看该作者

为什么只能从socket中读出1460个字节

MTU。

论坛徽章:
0
9 [报告]
发表于 2003-06-13 21:28 |只看该作者

为什么只能从socket中读出1460个字节

MAXDATASIZE ???
在哪里使用了


还有代码太乱了
自己使用code对齐一下

论坛徽章:
0
10 [报告]
发表于 2003-06-16 11:38 |只看该作者

为什么只能从socket中读出1460个字节

不好意思,这两天有事没上来。  
   MAXDATASIZE 在程序第一行,就是每次循环读socket的缓冲区大小。
  想想会不会是服务器端写socket的缓冲区比较小,而 client端可能会读得太快,导致读到空就返回了,因为这是测试程序,没有考虑到延时,所以会产生这种情况??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP