Я написал небольшую программу на 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);
}
}
}
}