1. connect() TCP(SOCK_STREAM)是连接到服务端,UDP(SOCK_DGRAM)是把本地地址端口和服务端的对应起来,并没有建立连接
connect前也可以用bind()绑定本地地址端口到clientfd,bind的参数是本地地址端口;不使用bind则会自动绑定个
2. 如果是UDP,则可以不用connect指定目标地址,直接用sendto就可以,recvfrom前必须绑定个地址(connect,bind,sendto都可以绑定本地地址端口)
TCP使用sendto前必须要connect
若同时使用connect和sendto,若2个的目标地址不一样可能会引起错误或数据包丢失
3.accept recvfrom getsockname最后一个参数 fromlen 要给个初始值,否则第一个连接(端口收到的第一个数据包)的发送方IP地址总是0.0.0.0,端口也是0,如:
fromlen = sizeof(from); recvfrom(...(struct sockaddr *)&from, &fromlen);
4.SO_REUSEADDR 端口重用,否则关闭后马上再次打开bind会失败 ,有的不支持SO_REUSEPORT(netstat -tuan 端口显示TIME_WAIT,1-4min)
int opt=1; setsockopt(sckfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
connect前也可以用bind()绑定本地地址端口到clientfd,bind的参数是本地地址端口;不使用bind则会自动绑定个
2. 如果是UDP,则可以不用connect指定目标地址,直接用sendto就可以,recvfrom前必须绑定个地址(connect,bind,sendto都可以绑定本地地址端口)
TCP使用sendto前必须要connect
若同时使用connect和sendto,若2个的目标地址不一样可能会引起错误或数据包丢失
3.accept recvfrom getsockname最后一个参数 fromlen 要给个初始值,否则第一个连接(端口收到的第一个数据包)的发送方IP地址总是0.0.0.0,端口也是0,如:
fromlen = sizeof(from); recvfrom(...(struct sockaddr *)&from, &fromlen);
4.SO_REUSEADDR 端口重用,否则关闭后马上再次打开bind会失败 ,有的不支持SO_REUSEPORT(netstat -tuan 端口显示TIME_WAIT,1-4min)
int opt=1; setsockopt(sckfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));