关于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);
}