linux下的udp通訊

一、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函數。是的,應該用,所以我沒有想到會是這個有錯誤。後來問老大才知道,是因爲用了才發生的錯誤,所以他的解決方法是:使用兩次!!

這確實是我想不到的。

 

記錄下這一次遇到的問題,以便以後可以看看。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章