[关闭]
@guochy2012 2014-06-07T05:01:49.000000Z 字数 692 阅读 1505

UDP

未分类

本地地址: getsockname
远程地址: getpeername

UDP的数据 以报文截断
要么一次性接收,否则不会留在缓冲区中。

recvfrom返回值为0 不代表错误

ICMP异步错误

先启动客户端 键盘输入“aaaa“ 然后client阻塞在recv上
UDP无连接 所以sendto一定成功 
这时产生ICMP错误应答 
异步错误无法返回给未连接的套接字
解决方案是UDP也可以使用connect函数,此时recvfrom就可以收到异步错误,而返回-1 
UDP connect不意味着真正建立链接,仅仅维护了一种信息
此时的sendto可以用send write来代替 

客户端有多个IP

UDP聊天室

C2S_LOGIN
C2S_LOGOUT
C2S_ONLINE_USER 

server和client都维护了一个全局变量

用户验证 循环
发送在线人数
发送用户列表
向其他用户通知有新用户登录(组装一个信息)

UNIX域

int listenfd  创建监听套接字  SOCK_STREAM
不需要设置地址重复利用
struct sockaddr_un 初始化地址结构
servaddr.SUN_FAMILY = AF_UNIX
servaddr.sun_path, "test_socket"  文件名
bind 
listen SOMAXCONN
accept
这里有个问题 server再次启动时 地址已经使用
解决方案是  unlink

bind创建一个权限为0777 & ~umask 的文件
sun_path 最好使用绝对路径 /tmp/test_socket
支持流式套接字和报文套接字
connect发现监听队列满,会发生错误,这与TCP不同,TCP会忽略,导致client重传SYN 
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注