我在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);
}
}
}
}