編程的整體框架
bind:綁定服務器:TCP地址和端口號
receivefrom():阻塞等待客戶端數據
sendto():指定服務器的IP地址和端口號,要發送的數據
????????無連接盡力傳輸,UDP:是不可靠傳輸
????????實時的音視頻傳輸,DNS域名解析包
服務端編寫
step1:socket
int socket(int domain,int type,int protocol);
參數domainAF_INETAF_INET6AF_UNIX,AF_LOCALAF_NETLINKAF_PACKET
typeSOCK_STREAM: 流式套接字,唯一對應于TCPSOCK_DGRAM:數據報套接字,唯一對應著UDPSOCK_RAW:原始套接字
protocol一般填0,原始套接字編程時需填充
返回值成功返回文件描述符出錯返回-1
step2:addr
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
sockfd
通過socket()創建的套接字文件描述符,例如int sockfd = socket(AF_INET, SOCK_STREAM, 0);2level
選項的協議層級,常見值:
SOL_SOCKET:通用套接字層級(如SO_REUSEADDR)
IPPROTO_TCP:TCP協議層級(如TCP_NODELAY)
IPPROTO_IP:IP協議層級(如IP_TTL)optname
具體選項名稱,常用選項:
SO_REUSEADDR:允許地址復用(解決bind時的Address already in use問題)
SO_RCVTIMEO:設置接收超時時間
SO_SNDBUF:調整發送緩沖區大小optval
選項值的指針,類型根據選項不同而變化:
布爾值:int reuse = 1;
時間結構:struct timeval timeout = {5, 0};(5秒超時)
緩沖區大小:int buf_size = 8192;optlen
選項值的字節長度,例如sizeof(reuse)
step3:bind,錯誤返回-1
定義結構體
清空結構體
填充
調用bind函數
sockaddr_in創建的是網絡字節序
主機字節序到網絡字節序
u_long htonl(u_long hostlong);
u_short htons(u_short short);
step4:while中revcform
- sockfd:需要讀取的套接字描述符。
- buf:數據讀取到的緩沖區的指針。
- len:buf的最大長度。
- flags:一組影響函數行為的標志位。
- src_addr:一個指向源地址結構的指針。
- addrlen:一個指向源地址結構長度的指針。
成功時返回接收的字節數,失敗時返回-1
失敗返回-1
需要將獲取的網絡字節序轉換成字符串
將32位網絡字節序二進制地址轉換成點分十進制的字符串
inet_pton()int inet_pton(int af, const char* src ,void* dst)將IPV4/IPV6 的地址轉換成binary格式使用于IPV4/IPV6能正確處理255.255.255.255的轉換問題參數:1.地址協議族(AF_INET或AF_INET6)2.src:是一個指針(填寫分點形式的IP地址(主要指IPV4))dst:轉換的結果給到dst
我們是接收,用的是下面的
inet_ntop(int af,const void *src,char *dst,socklen_t size)
? ? 把ipv4和ipv6的網絡字節序變成本地的字符串形式的IP地址
參數
? ? 1.af:地址協議族(AF_INET或AF_INET6)
? ? 2.src:是一個指針(32),(結構體里內容)
? ? 3.dst:輸出結果為32位點分形式的IP地址
? ? 4.size:長度
成功返回非零
客戶端編寫
客戶端是需要傳參進去的,main就需要帶參數
進行判斷傳參格式是否正確
使用socket函數,判斷是都成功
成功之后將鍵盤輸入的端口好轉型為int給到定義的port
之后編寫結構體(bind函數那部分內容)
while循環鍵盤輸入內容
下面是sendto()函數知識點
頭文件:#include < sys/types.h >
頭文件:#include < sys/socket.h >int sendto ( socket s , const void * msg, int len, unsigned int flags,const struct sockaddr * addr , int tolen ) ;函數說明:sendto() 用來將數據由指定的socket傳給對方主機。參數說明:s:已建好連接的socket,如果利用UDP協議則不需經過connect操作。msg:待發送數據的緩沖區len:緩沖區長度flags:調用方式標志位, 一般為0, 改變flags,將會改變sendto發送的形式。addr:(可選)指針,指向目的套接字的地址tolen:addr所指地址的長度返回值:如果成功,則返回發送的字節數失敗則返回SOCKET_ERROR。