网络编程技术(西电课件)_第2章v2.ppt
文本预览下载声明
对等模式无连接套接字特点: 通信双方是对等的:要经过4个阶段,创建套接字、绑定套接字、发送/接收数据、关闭套接字; 双方都必须确切知道对方的网络地址,并在各自的进程中将约定好的网络地址绑定到自己的套接字上; 每一次传递数据时,在sendto和recvfrom系统调用中必须包含对方的网络地址信息; 进程也会因为发送或接收数据而发生阻塞。 2.客户机/服务器模式 图2.11 C/S模式的数据报套接字的编程模型 C/S模式无连接套接字特点: 应用双方不是对等的:服务器要先启动,被动等待访问,要经过创建套接字、绑定套接字、发送/接收数据、关闭套接字4个阶段,将套接字绑定到众所周知的端口上; 客户机套接字使用动态分配的自由端口上,不需要进行绑定;如果服务器要向客户机发送数据,必须先用recvfrom()函数接收一次对方的数据,才能知道对方地址和端口; 客户机主动发送数据,并在数据报中携带双方的地址和端口; 服务器可以接受多个客户端的数据。 #include sys/socket.h int sendto(int s, char *msg, int len, int flags; struct sockaddr *to, int tolen); 参数列表: s 指定的socket描述符 msg 指定要发送的消息 len 消息长度 flags 一般设置为0 to 对方的地址结构 tolen 结构struct sockaddr 的长度 返回值? : ???????? 成功???????? 实际发送的字节数 ???????? 错误???????? -1 sendto()的使用格式 #include sys/socket.h int recvfrom(int s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen); 参数列表: s 指定的socket描述符 buf 指定接收缓冲区 len 缓冲区长度 flags 一般设置为0 from 接收后,对方的地址结构将存在这里 fromlen 对方地址结构from的长度 返回值? : ???????? 成功???????? 实际接收的字节数 ???????? 错误???????? -1 recvfrom()的使用格式 2.4.3 数据报套接字的对等模式编程实例 聊天程序 #include sys/types.h #include unistd.h #include errno.h /*错误号的定义*/ #include signal.h /*中断处理*/ #include sys/socket.h #include arpa/inet.h #include stdio.h /* 中断处理过程,展示了定时中断的技巧*/ void int_proc( int signo) {printf(overtime!\n); } void main(int argc, char** argv) { struct sockaddr_in daddr, saddr, cmpaddr; int sockfd; int timer = 3; /*3秒钟后中断*/ char buffer[1024]; int addrlen, daddrlen, n, errno, pid;? /* 判断用户输入的命令行是否正确,如果有错,提示用法 */ if (argc != 5) { printf(“usage:%s destIP destPort srcIP srcPort\n, argv[0]); exit(0); } /* 设定中断处理函数,并设置时间限制 */ signal( SIGALRM, int_proc); alarm(timer); ? /* 建立数据报套接字 */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) { fprintf(stderr, socket error!\n); exit(1); } /* 为结构变量daddr的各个字段赋值 */ addrlen = sizeof(struct sockaddr_in); memset(daddr, 0, addrlen); daddr.sin_family = AF_INET; daddr.sin_port = htons(atoi(argv[2])); if (inet_pton(AF_INET, argv[1], daddr.sin_addr ) = 0) { fprintf(stderr, Invaild dest IP!\n); exit(0);
显示全部