日期:2014-05-16  浏览次数:20688 次

麻烦帮我看一下这个socket编程为什么结果不正确
这个是客户端程序,就是最后和客户端互动的那部分感觉不对,
两个printf是调试时候加上去的,能打出n,打不出m,然后停在那边不动了,
这是怎么回事?

C/C++ code

int main()
{
    int clientfd;
    int n;
    char buf[BUFFSIZE];
    struct sockaddr_in saddr;

    clientfd = my_socket(AF_INET, SOCK_STREAM, 0);

    bzero(buf,BUFFSIZE);
    bzero(&saddr, sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(S_PORT);
    inet_pton(AF_INET, "127.0.0,1", &saddr.sin_addr);

    my_connect(clientfd, (struct sockaddr *)&saddr, sizeof(saddr));



    while(fgets(buf, BUFFSIZE, stdin)!= NULL)
    {
        
        my_write(clientfd, buf, sizeof(buf));

            printf(" n : \n");
        if (!(n = my_read(clientfd, buf, BUFFSIZE)))
            puts(" Sorry, the server has been closed..\n");

        else 
            printf(" m : \n");
            my_write(STDOUT_FILENO, buf, n);


        bzero(buf,BUFFSIZE);
        
    }
    return 0;
}




------解决方案--------------------
堵塞在了my_read(clientfd, buf, BUFFSIZE),服务器返回什么?应该是长度没读够,一直再等
------解决方案--------------------
好吧,你这个程序写的比较蛋疼了,connect自己的socket,好吧,也行,但是你connect之后应该会获得一个socket fd吧,去看看connect的说明,你应该往那个fd里面写,才能够读出数据,还有,你这个里面并没listen怎么能够建立链接呢?,建议还是写个服务端吧。看看 accept() listen()等等。
------解决方案--------------------
服务端没回数据,客户端当然read阻塞,否则还能干什么。
------解决方案--------------------
感觉楼主的SELECT函数用的有问题啊,select是用来判断数据通信套接字的,可是楼主却是用在监听套接字上的,而且 FD_ISSET(confd, &full_set);看不明白有什么作用,这个是个判断吗?一定为返回0啊,因为肯定是不在其中的。s_ret=my_select(maxfd+1,&tmp_set,NULL,NULL,NULL);是什么函数,是不是返回值有问题,一直是1,导致一直continue?