@guochy2012
2014-06-07T05:01:49.000000Z
字数 692
阅读 1505
未分类
本地地址: 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