一、server端:
1. socket創建套接字
int sock = socket(AF_INET, SOCK_DGRAM, 0) //本地udp用AF_UNIX
2. bind綁定地址和端口
struct sockaddr_in svr_addr;
memset(&svr_addr, 0, sizeof(struct sockaddr_in));
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(9999);
if (bind(sock, (struct sockaddr *)&svr_addr, sizeof(struct sockaddr_in)) < 0)
{
printf("bind failed: %d\n", errno);
return -1;
}
3. 接收client端數據並做迴應
while(1)
{
recvfrom();
sendto();
}
二、client端
1. socket創建套接字
2. sendto發送數據
3. recvfrom接收服務端迴應
大概流程就是這樣了。
在實際實踐中,我遇到了一些很悲劇的問題:
1. bind無法綁定成功, errno錯誤代號爲99
這個問題其實很簡單,我是因爲在一個while(1) 循環中,如果失敗,就會繼續下一次循環並重新綁定。簡單的說,就是重複綁定。
2. client端的sendto無法成功,errno爲101,查找相關文檔,發現是找不到指定的目標。
這個就鬱悶了。我弄了很久,檢查了所有的函數和參數,就是找不到!!後來發現,是因爲在設置server地址和端口時,將字符ip轉換爲unsigned long 型時,
用了一次htonl函數。是的,應該用,所以我沒有想到會是這個有錯誤。後來問老大才知道,是因爲用了才發生的錯誤,所以他的解決方法是:使用兩次!!
這確實是我想不到的。
記錄下這一次遇到的問題,以便以後可以看看。。