首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

关于socket通信,该如何处理

2012-02-16 
关于socket通信我需要实现一个socket服务器端,使用UDP连接,当接收到start时,将变量flag置1;当接收到end

关于socket通信
我需要实现一个socket服务器端,使用UDP连接,当接收到"start"时,将变量flag置1;当接收到"ended"时,将变量flag置0。当flag=1时,启动一个数据发送模块,当flag=0时,停止数据发送。代码如下:
int main()
{
  int socket1;
  socket1 = socket(AF_INET, SOCK_DGRAM, 0);

  my_addr.sin_family = AF_INET;
  my_addr.sin_port = htons(1234);
  my_addr.sin_addr.s_addr = INADDR_ANY;
  bzero(&(my_addr.sin_zero),8);
  bind(socket1, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

  while(1)
  {
  int recvlen = sizeof(struct sockaddr);
  recvfrom(socket1, buf_r, BufLen, 0, (struct sockaddr *)&their_addr, &recvlen);
  buf_r[BufLen] = 0;
   
  if(strcmp(buf_r, "start") == 0)
  {
  flag = 1;
  for(;;)
  {
  if( flag == 0)
  break;
   
  // 数据发送模块
  }
  }
  else if(strcmp(buf_r, "ended") == 0)
  {
  flag = 0;
  }
  }
}

如果代码这样写,当server收到"ended"时,不能将flag置0,也不能停止数据发送模块(即跳出for()循环)。
请问应该如何修改能在server收到"ended"时,将flag置0,并停止数据发送模块(即跳出for()循环)?多谢!


[解决办法]
楼主你这个是单线程啊,当在for循环里的时候,不跳出来,你怎么再次去接受ended呢?

开两个线程可以解决,一个负责接收,一个负责发数据
[解决办法]
楼上说的对,可以一个线程recvfrom,一个线程做“数据发送模块”,例如:

void *process (void *threadid)
{
for(;;)
{
if (q == 2)
break;

// 数据发送模块 
}
}

int main()
{
ret = recvfrom(socket1, buf_r, BufLen, 0, (struct sockaddr *)&their_addr, &recvlen);
if(strcmp(buf_r, "start") == 0)
{
q = 1;
}

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&pthread, &attr, process, &q);

ret = recvfrom(socket1, buf_r, BufLen, 0, (struct sockaddr *)&their_addr, &recvlen);
if(strcmp(buf_r, "ended") == 0)
{
q = 2;
}

pthread_attr_destroy(&attr);
pthread_join(pthread, NULL);

}

热点排行