socket编程需要注意的问题

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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章