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