您的位置:首页 > 理论基础 > 计算机网络

TCP 组播 广播

2015-07-02 19:24 507 查看
在TCP/IP中传输信息主要方式有两种,UDP和TCP,UDP是不可靠通信,在传输信息之前并没有和服务器建立连接,客户端采用sendto函数(可通过man命令查看sendto函数的原型),服务器端主要采用recvfrom函数接受来自客户端的信息。

TCP采用可靠连接,主要是连接采用三次握手,断开时采用四次挥手,具体过程可以参考wireshark抓包进行查看其具体过程,在具体建立连接的过程主要是

1、建立socket套接字sockfd

2、listen监听

3、accept接收来自客户端的连接,建立新的套接字connfd

4、recv函数接收来自客户端的信息,客户端采用send函数进行传送数据。

接下来po出组播的代码

最主要的是这部分代码:通过设置组播的IP和本机的IP来接收发送到组播IP的信息,

同时通过setsockopt函数来设置函数的属性

struct ip_mreqn addr;
addr.imr_address.s_addr = inet_addr("192.168.4.69");//需要同时绑定本机IP和组播的IP
addr.imr_multiaddr.s_addr = inet_addr("224.0.1.1");
addr.imr_ifindex = 0;

setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&addr,sizeof(addr));//设置socket的属性


int main(int argc, const char *argv[])
{
int udp_socket;
char buf[64];
struct sockaddr_in myaddr,peeraddr;
int peer_len;
if((udp_socket = socket(PF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket");
exit(1);
}
#if 1
memset(&myaddr,0,sizeof(myaddr));
// bzero(&myaddr,sizeof(myaddr));

myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(50001);
myaddr.sin_addr.s_addr = inet_addr("224.0.1.1");
if(bind(udp_socket,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
{
perror("bind");
exit(1);
}
#endif

#if 1
memset(&peeraddr,0,sizeof(peeraddr));
peer_len = sizeof(peeraddr);

struct ip_mreqn addr; addr.imr_address.s_addr = inet_addr("192.168.4.69");//需要同时绑定本机IP和组播的IP addr.imr_multiaddr.s_addr = inet_addr("224.0.1.1"); addr.imr_ifindex = 0; setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&addr,sizeof(addr));//设置socket的属性
while(1)
{
if(recvfrom(udp_socket,buf,sizeof(buf),0,(struct sockaddr *)&peeraddr,
&peer_len) == -1)
{
perror("recvfrom");
exit(1);
}
printf("from %s : %d : %s",inet_ntoa(peeraddr.sin_addr),
ntohs(peeraddr.sin_port),buf);
}
#endif
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  组播