udp端口阻塞如何解决

keenboy 2005-06-27 11:33:29
基于UDP的c/s程序,但失常发现服务器的udp端口有阻塞现象,用netstat观察端口有数据未取走。哪位能support一下!
...全文
2189 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
keenboy 2005-06-28
  • 打赏
  • 举报
回复
取不走是说用netstat看UDP端口上有数据
yyy790601 2005-06-28
  • 打赏
  • 举报
回复
...主要是client的机器如果收不到回应就会停住这个机制不想改变,但这样client端无法进行后续的操作!...

你既然希望收不到回应就停住,又想进行后续的操作,两者能兼得?
取不走是什么意思。是在buf中没法读,还是在socket管道中没法读。


keenboy 2005-06-28
  • 打赏
  • 举报
回复
问题看上去已经解决,由于我们的server是需要跟db交互的所以在有段代码在操作db后没有free其连接,导致udp处理线程停滞!再有数据来也没有反应!
keenboy 2005-06-27
  • 打赏
  • 举报
回复
也不是每次都取不走,主要是client的机器如果收不到回应就会停住这个机制不想改变,但这样client端无法进行后续的操作!
keenboy 2005-06-27
  • 打赏
  • 举报
回复
//这是程序的大致结构,有些变量已经有值
typedef struct taskset_s
{
unsigned short valid; /* The thread of task is valid */
unsigned short idx; /* The task index */
void * data; /* The task's argument */
pthread_t thread; /* The task's thread handle */
} taskset_t;

void function_init();
{
if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
DBG(L_ERR, "Create socket failed \n");
}
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(PORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* automatically fill with my IP*/

memset(&(my_addr.sin_zero), '\0', 8); /* zero the rest of the struct */

ret = bind(sock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in));
if(ret < 0) {
DBG(L_ERR, "Bind to port: %d failed\n", port);
exit(1);
}
ret = init_taskset();
if(ret < 0)
{
DBG(L_ERR, "init taskset failed \n");
}
return ret;
}

int init_taskset(void)
{
int ret;
int i;
taskset_t *p = NULL;

if(pthread_create(&(p->thread), 0, receiver_thread, p)){
p->valid = 1;
}
return 0;
}

static void *receiver_thread(void *param)
{
int addr_len = sizeof(struct sockaddr);
int len;
struct sockaddr_in their_addr; // connector's address information
char rev_buff[MAX_SIZE];
int buff_len;
buf_t *buf = (buf_t *)malloc(sizeof(buf_t));

while (1) {
bzero(rev_buff, MAX_SIZE);
if((len=recvfrom(sock, rev_buff, MAX_SIZE, 0,\
(struct sockaddr *)&their_addr, &addr_len)) == -1);
buf->sock = sock;
buf->from = their_addr;
buf->buf = rev_buff;
buf->buf_len = MAX_SIZE;
Process(buf);
}

free(buf);

return NULL;
}
yyy790601 2005-06-27
  • 打赏
  • 举报
回复
取不走?!?!?!
贴代码!!!
keenboy 2005-06-27
  • 打赏
  • 举报
回复
我这里的情况跟你所说的不太一样,通常的阻塞是说没有数据过来去读的时候程序会停在一些函数上,现在的情况是client端发送了请求过来,但是buf中的数据却取不走(用netstat看时Recv-Q中是有数据的)
yyy790601 2005-06-27
  • 打赏
  • 举报
回复
第一次调用 socket() 建 立套接字描述符的时候,内核就将它设置为阻塞。如果不想套接字阻塞, 就要调用函数 fcntl():
#include <unistd.h>
  #include <fontl.h>
   .
   .
   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
   fcntl(sockfd, F_SETFL, O_NONBLOCK);
   .
   .
  如果尝试着从一个非阻塞的套接字读信息并且没有任何数据,它不允许阻 塞--它将返回 -1 并将 errno 设置为 EWOULDBLOCK。 但是一般说来,这种询问不是个好主意。如果你让你的程序在忙等状 态查询套接字的数据,你将浪费大量的 CPU 时间。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧