读书人

关于socket通信,该如何处理

发布时间: 2012-02-16 21:30:36 作者: rapoo

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

}

读书人网 >网络协议

热点推荐