打印
[嵌入式linux]

tcp中send数据出现的问题

[复制链接]
2439|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
77muke|  楼主 | 2010-9-17 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define PORT 3490
struct frame
{
    int frame_seq;
    void *date;
    int frame_date_len;
};
int main(int argc, char *argv[])
{
    int sockfd,numbytes;
    struct hostent *he;
    struct sockaddr_in their_addr;
    struct frame send_frame;
    int num=0;
    if(argc!=2)
    {
        fprintf(stderr,"usage:client hostname\n");
        exit(1);
    }
    if((he=gethostbyname(argv[1]))==NULL)
    {
        herror("gethostbyname");
        exit(1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("socket");
        exit(1);
    }
    int opt=SO_REUSEADDR;               //设置套接字为地址重用方式
    setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    memset(&their_addr,0,sizeof(their_addr));
    their_addr.sin_family=AF_INET;
    their_addr.sin_port=htons(PORT);
    //their_addr.sin_addr=*((struct in_addr *)he->h_addr);
    their_addr.sin_addr.s_addr = inet_addr("192.168.9.140");
    //bzero(&(their_addr.sin_zero),8);

    if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
    {
        perror("connect");
        exit(1);
    }
    char buf[50<<10]="";
    fd_set wfd;
    struct timeval timeout;
    int send_len=0, buf_len=0;
    int ret;
    do
    {
        send_frame.frame_date_len = random()%(20<<10);
        send_frame.frame_seq = num++;
        send_frame.date=malloc(send_frame.frame_date_len);
        memcpy(buf,(char *)&send_frame,sizeof(send_frame));
        do
        {
            timeout.tv_sec=10;
            timeout.tv_usec=0;
            FD_ZERO(&wfd);
            FD_SET(sockfd,&wfd);
            ret=select(sockfd+1, NULL, &wfd, NULL, &timeout);
            if(ret == -1)
            {
                perror("select");
            }
            else if(ret == 0)
            {
                printf("send date time out.\n");
                exit(0);
            }
            else
            {
                if( FD_ISSET(sockfd,&wfd) )
                {
                    buf_len = send_frame.frame_date_len - send_len;
                    if((numbytes=send(sockfd, buf+send_len, buf_len, 0))==-1)
                    {
                        perror("send");
                        exit(1);
                    }
                    else
                        printf("frame_seq=%d,send date=%d,frame_date_len=%d\n",send_frame.frame_seq,numbytes,send_frame.frame_date_len);
                    send_len = send_len+numbytes;
                }
                else
                    exit(1);
             }
        }while( send_len < send_frame.frame_date_len );
        usleep(40000);
        free(send_frame.date);
        //memset(&buf,0,sizeof(buf));
    }while(1);
    close(sockfd);
    return 1;
}
如上程序,发送一个数据结构体,一直出现发送数据不对,求解。

相关帖子

沙发
77muke|  楼主 | 2010-9-17 15:47 | 只看该作者
补充发送的数据为:
frame_seq=0,send date=1383,frame_date_len=1383
frame_seq=1,send date=0,frame_date_len=966
frame_seq=2,send date=17154,frame_date_len=18537
frame_seq=3,send date=0,frame_date_len=10355
frame_seq=4,send date=0,frame_date_len=3153
frame_seq=5,send date=0,frame_date_len=15615
frame_seq=6,send date=0,frame_date_len=13386
frame_seq=7,send date=0,frame_date_len=14572
frame_seq=8,send date=0,frame_date_len=16169
frame_seq=9,send date=1124,frame_date_len=19661
frame_seq=10,send date=0,frame_date_len=14522

使用特权

评论回复
板凳
77muke|  楼主 | 2010-9-17 16:03 | 只看该作者
已解决,send—len发送完一帧后需清空。呵呵~~

使用特权

评论回复
地板
一朝成名| | 2010-9-17 20:35 | 只看该作者
:L

少了一个memset

使用特权

评论回复
5
sinanjj| | 2010-9-17 22:13 | 只看该作者
太长........

使用特权

评论回复
6
77muke|  楼主 | 2010-9-17 23:11 | 只看该作者
呵呵,谢谢楼上提醒

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

78

帖子

0

粉丝