读书笔记:在局域网中实现多播功能(3)
//如果用户输入结束,程序就终止了
WaitForSingleObject(hHandle[0], INFINITE);
WSACleanup();
return 0;
}
void do_send(void* arg)
{
SOCKET server = (SOCKET)arg;
char sendline[BUFFER_SIZE+1];
sockaddr_in remote;
memset(&remote, 0, sizeof(remote));
remote.sin_addr.s_addr = inet_addr ( MULTICAST_IP );
remote.sin_family = AF_INET ;
remote.sin_port = htons(MULTICAST_PORT);
for(;;) //读取用户输入知道用户输入"end"
{
cin.getline(sendline, BUFFER_SIZE);
if(strncmp(sendline,"end",3)==0)
break;
//发送用户输入的数据到多播组
sendto(server, sendline, strlen(sendline), 0, (sockaddr*)(&remote), sizeof(remote));
}
cout<<"do_send end..."<}
void do_read(void* arg)
{
SOCKET server = (SOCKET)arg;
char buf[BUFFER_SIZE+1];
int ret;
sockaddr_in client;
int clientLen;
for(;;) //一直读取知道主线程终止
{
clientLen = sizeof(client);
memset(&client, 0, clientLen);
ret = recvfrom(server, buf, BUFFER_SIZE, 0, (sockaddr*)(&clientLen), &clientLen);
if ( ret == 0) //do_read在用户直接回车发送了一个空字符串
{
continue;
}
else if( ret == SOCKET_ERROR )
{
if( WSAGetLastError() == WSAEINTR ) //主线程终止recvfrom返回的错
break;
cout<<"Error in recvfrom: "< break ;
}
buf[ret] = '\0';
cout<<"received: "< }
cout<<"do_read end..."<}
当然上面的代码如果应用到实际的程序中还需要作更多的工作,不过实现多播功能真的很简单,不是吗 :-)
我只是刚刚才开始学习网络编程方面的东东,上面的代码如果你认为有什么问题,请直接发email给我。
- 上一篇:让你的控制台程序也支持自动补齐
- 下一篇:VC/VB 进行图像数据存储数据库心得