首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

客户端断开socket之后,服务器端才能收到数据?该怎么解决

2012-05-08 
客户端断开socket之后,服务器端才能收到数据?android手机为服务器端,PC端软件为客户端PC客户端通过socket

客户端断开socket之后,服务器端才能收到数据?
android手机为服务器端,PC端软件为客户端
PC客户端通过socket发送数据给服务器端,服务器端一直接收不到数据,只有当PC客户端断开socket连接之后,
手机服务器端才接收到数据,请问是怎么回事?怎么处理,谢谢
代码如下:
android 手机端linux(server)

C/C++ code
int make_server_socket(){    int sockfd = socket(PF_INET, SOCK_STREAM, 0);    struct sockaddr_in my_addr;    memset(&my_addr, 0, sizeof(my_addr));    my_addr.sin_family = AF_INET;    my_addr.sin_port = htons(LISTENPORT);    my_addr.sin_addr.s_addr = INADDR_ANY;    if(sockfd>0)    {        int on = 1;        setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));        if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==0)        {            if(listen(sockfd, 0)==0)            {                // No error            }            else            {                close(sockfd);                sockfd = -3;            }        }        else        {            close(sockfd);            sockfd = -2;        }    }    return sockfd;}int accept_socket(int sockfd){    // Block until connections    struct sockaddr_in peer_addr;    unsigned int sin_size = sizeof(peer_addr);    int new_fd = accept(sockfd, (struct sockaddr *)&peer_addr, &sin_size);    return new_fd;}int recv_socket(int sockfd, void* buffer, int size){    int received = 0;    while (buffer && received < size)    {        int result = recv(sockfd, buffer + received, size - received, MSG_NOSIGNAL);        if (result > 0)        {            received += result;        }        else        {            received = result;            break;        }    }    return received;}.............    while (1)    {        listenfd = make_server_socket();    memset(receive_buffer,0,sizeof(receive_buffer));        if (listenfd > 0)        {            while (1)            {                tcpipfd = accept_socket(listenfd);                                if (tcpipfd > 0)                {                    len=recv_socket(tcpipfd, recmsg, BUF_LEN_1024);                }                else                {                    break;                }        sleep(1);            }            close_socket(listenfd);        }        sleep(2);    }

............


java客户端:
C/C++ code
    byte[] bs = new byte[] { (byte) 127, (byte) 0, 0, 1 };    InetAddress addr = InetAddress.getByAddress(bs);    pcsocket =new Socket(addr,port);    sender=new BufferedOutputStream(pcsocket.getOutputStream(),20);    receiver=new BufferedInputStream(pcsocket.getInputStream(),20);        sender.write(data.getBytes(),0,data.length());        sender.write('\n');        sender.flush();


[解决办法]
C/C++ code
int recv_socket(int sockfd, void* buffer, int size){    int received = 0;    while (buffer && received < size)    {        int result = recv(sockfd, buffer + received, size - received, MSG_NOSIGNAL);        if (result > 0)        {            received += result;        }        else        {            received = result;            break;        }    }    return received;} 

热点排行