仅通过UDP套接字接收59个数据包(每个8192个字节)

时间:2012-02-18 15:27:43

标签: iphone c sockets udp vmware

我在XCODE中编写了一个小程序,并在iPhone 4.0模拟器中运行。该程序是从服务器获取数据的客户端。服务器每秒发送两个数据包(每个8192字节)。

首先,小程序运行良好,它成功收到前59个数据包。在第60个数据包时,“recvfrom”未返回,似乎被阻止等待数据包。

实际上我捕获了数据包,第60个数据包和下面的数据包确实到了。所以我很困惑为什么第60个数据包失败。

我尝试了很多次,我总是在第60包失败了。从捕获的数据包中,第60个数据包与其他数据包一样正常。

BTW:我在Windows 7上运行,并且在VMware工作站上安装了MAC leopard OS。

不确定VMware或iPhone模拟器是否有30秒的连接限制?

我几次查看代码,到目前为止我没有发现任何代码错误。 我相信VMWARE或iPhone模拟器有一些限制。

我将代码粘贴如下, 这是在CentOS上运行的服务器部分:

void test_main_thread(void)
{
    int sockfd;
    struct sockaddr_in my_addr;
    struct sockaddr_in client_addr;
    socklen_t len;
    int msg_len;
    uint8_t buffer[MAX_BUF_LEN],i;
    int rc;
    FILE *fp;
    int ret;

    fp = fopen("data","r");
    if (fp == NULL) {
        return;
    }

    if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
        fclose(fp);
        return;
    }
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = PF_INET;
    my_addr.sin_port = htons(SERVER_DATA_PORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
        fclose(fp);
        close(sockfd);
        return;
    }

    bzero(&client_addr, sizeof(client_addr));
    len = sizeof(struct sockaddr);

    /*loop for the data*/

    msg_len = recvfrom(sockfd, buffer, sizeof(buffer), 0,
                   (struct sockaddr *)&client_addr, &len);

    if (msg_len <= 0) {
        return;
    }

    while(1) {
        msg_len = MAX_BUF_LEN;
        msg_len = fread(buffer, 1, msg_len, fp);
        if (msg_len <= 0) {
            break;
        }

        rc = sendto(sockfd, buffer, msg_len, MSG_DONTWAIT,
                (struct sockaddr *)&client_addr, len);
        usleep(500000);

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

以下是在MAC OS 10.6.5上运行的主要代码(基于VMWare工作站)XCODE 3.2 iPhone模拟器4.0。

- (IBAction)buttonPressed:(id)sender
{
int data_sockfd;
struct sockaddr_in data_server_addr;

if ((data_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
    NSLog(@"data socket created");
    exit(1);
}

NSLog(@"data socket created");

data_server_addr.sin_family = AF_INET;
data_server_addr.sin_addr.s_addr = inet_addr("192.168.1.106");
data_server_addr.sin_port = htons(MYDATAPORT);
bzero(&(data_server_addr.sin_zero), 8);

int conn = connect(data_sockfd, (struct sockaddr*)&data_server_addr, sizeof(struct sockaddr));
int ret = 0;
char readBuffer[BUFFER_SIZE];
socklen_t len;
struct sockaddr client_addr;

bzero(readBuffer,BUFFER_SIZE);

if (conn != -1)
{
    readBuffer[0] = 0xEE;
    send(data_sockfd,readBuffer,12,0);
    NSLog(@"send first 12 bytes");
    while (1) {

        ret = recv(data_sockfd, readBuffer, BUFFER_SIZE, 0);
        if (ret > 0) {
            /*receive data*/
            NSLog(@"receive data len is %d",ret);
        } else {
            NSLog(@"error %d",ret);
        }
    }
}
}

0 个答案:

没有答案