получать только 59 пакетов (8192 байта каждый) через сокет UDP - PullRequest
0 голосов
/ 18 февраля 2012

Я написал небольшую программу на XCODE и запустил симулятор iPhone 4.0.Эта программа является клиентом, который получает данные с сервера.Сервер будет отправлять два пакета (8192 байта каждый) каждую секунду.

Сначала небольшая программа работает хорошо, она успешно получила первые 59 пакетов.в то время как на 60-м пакете «recvfrom» не возвращается, кажется, заблокирован для ожидания пакета.

На самом деле я захватил пакеты, 60-й пакет и следующие пакеты действительно пришли.Поэтому я не понимаю, почему произошел сбой 60-го пакета.

И я много раз пытался, у меня всегда получался сбой в 60-м пакете.Из перехваченных пакетов 60-й пакет нормальный, как и другие.

Кстати: я работал на Windows 7 и на рабочей станции VMware установил ОС MAC leopard.

Не уверен, что симулятор 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);
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...