- 论坛徽章:
- 0
|
for (; {
/* waiting incoming message from port 4000 */
t = 0;
n = 0;
FD_ZERO(&fdR);
FD_SET(sockfd_dvs, &fdR);
memset(&tv, 0, sizeof(struct timeval));
tv.tv_sec = 5;
tv.tv_usec = 0;
t = select(sockfd_dvs + 1, &fdR, NULL, NULL, &tv);
//DPRINT("select return t = %d, tv_sec = %d, tv_usec = %d\n", tv.tv_sec, tv.tv_usec);
if (t > 0 && FD_ISSET(sockfd_dvs, &fdR)) {
static char *pmsgstart = NULL, *p1 = NULL, *p2 = NULL;
/*receive message from network*/
memset(&saddr, 0, sizeof(struct sockaddr_in));
n = 0;
len = sizeof(struct sockaddr_in);
n = recvfrom(sockfd_dvs, &RecvMsg[0], MAX_MSG_LENGTH, 0,
(struct sockaddr*)&saddr, &len);
RecvMsg[n] = '\0';
DPRINT("sin_add = %u, sin_port = %u\n",saddr.sin_addr, saddr.sin_port);
DPRINT("the sockfd_dvs got a message [%s] from %s:%d\n",
RecvMsg, inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
//sendto(sockfd_dvs, RecvMsg, MAX_MSG_LENGTH, 0, (struct sockaddr*)&saddr, len);
FD_CLR(sockfd_dvs, &fdR);
/*analyse the message body, and find out the information that we want to get*/
}/*if ISSET(sockfd_dvs)*/
}/*for*/
奇怪的问题,我使用select 作为服务器端来接收UDP, 但只能接受每个客户端的第一个包(如果有多个客户端),客户端的第二个包的信息就收不到(select 没有检测到可读句柄), 但如果在recvfrom()函数后,调用sendto()到相同的客户端,则接受同一客户端的数据包正常,我怀疑是否是sockfd 被组塞在 write 下,但我不需要做sendto, 我该如何解决这个问题。
谢谢! |
|