基於UDP的select函數用法

來源:互聯網
上載者:User

/************SERVER**************/<br />#include <winsock2.h><br />#include <stdio.h><br />#define PORT_A11111<br />#define PORT_B 22222<br />void main(int argc, char **argv)<br />{<br />WSADATA wsaData; // 套介面資訊資料<br />SOCKET socka;// 套介面a<br />SOCKET sockb;// 套介面b</p><p>int nPortA = PORT_A;<br />int nPortB = PORT_B;<br />fd_set rfd;// 讀描述符集<br />timeval timeout;// 定時變數<br />sockaddr_in addr; // 告訴sock 應該在什麼地方licence<br />char recv_buf[1024];// 接收緩衝區</p><p>int nRecLen; // 用戶端地址長度!!!!!!</p><p>sockaddr_in cli;// 用戶端地址<br />int nRet; // select傳回值<br />if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)<br />{<br />printf("failed to laod winsock!/n");<br />return;<br />}<br />socka = socket(AF_INET, SOCK_DGRAM, 0);// 建立資料報socka<br />if (socka == INVALID_SOCKET)<br />{<br />printf("socket()/n");<br />return;<br />}<br />sockb = socket(AF_INET, SOCK_DGRAM, 0);// 建立資料報sockb<br />if (sockb == INVALID_SOCKET)<br />{<br />printf("socket()/n");<br />return;<br />}<br />memset(&addr, 0, sizeof(addr));</p><p>addr.sin_family = AF_INET; // IP協議<br />addr.sin_port = htons(nPortA); // 連接埠<br />addr.sin_addr.s_addr = htonl(INADDR_ANY); // 在原生所有ip上開始監聽<br />if (bind(socka, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)// bind socka<br />{<br />printf("bind()/n");<br />return;<br />}</p><p>memset(&addr, 0, sizeof(addr));<br />addr.sin_family = AF_INET; // IP協議<br />addr.sin_port = htons(nPortB); // 連接埠<br />addr.sin_addr.s_addr = htonl(INADDR_ANY); // 在原生所有ip上開始監聽</p><p>if (bind(sockb, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) // bind sockb<br />{<br />printf("bind()/n");<br />return;<br />}<br />// 設定逾時時間為6s<br />timeout.tv_sec = 6;<br />timeout.tv_usec = 0;</p><p>memset(recv_buf, 0, sizeof(recv_buf)); // 清空接收緩衝區<br />while (true)<br />{<br />FD_ZERO(&rfd); // 在使用之前總是要清空</p><p>// 開始使用select<br />FD_SET(socka, &rfd); // 把socka放入要測試的描述符集中<br />FD_SET(sockb, &rfd); // 把sockb放入要測試的描述符集中</p><p>nRet = select(0, &rfd, NULL, NULL, &timeout);// 檢測是否有套介面是否可讀<br />if (nRet == SOCKET_ERROR)<br />{<br />printf("select()/n");<br />return;<br />}<br />else if (nRet == 0)// 逾時<br />{<br />printf("timeout/n");<br />closesocket(socka);<br />closesocket(sockb);<br />break;<br />}<br />else// 檢測到有套介面可讀<br />{<br />if (FD_ISSET(socka, &rfd))// socka可讀<br />{<br />nRecLen = sizeof(cli);<br />int nRecEcho = recvfrom(socka, recv_buf, sizeof(recv_buf), 0, (sockaddr*)&cli, &nRecLen);<br />if (nRecEcho == INVALID_SOCKET)<br />{<br />printf("recvfrom()/n");<br />break;<br />}<br />printf("data to port 11111: %s/n", recv_buf);<br />}<br />if (FD_ISSET(sockb, &rfd)) // sockb 可讀<br />{<br />nRecLen = sizeof(cli);<br />int nRecEcho = recvfrom(sockb, recv_buf, sizeof(recv_buf), 0, (sockaddr*)&cli, &nRecLen);<br />if (nRecEcho == INVALID_SOCKET)<br />{<br />printf("recvfrom()/n");<br />break;<br />}<br />printf("data to port 22222: %s/n", recv_buf);<br />}<br />}<br />}<br />WSACleanup();<br />}

/************CLIENT*************/<br />#include <winsock2.h><br />#include <stdio.h><br />#include <stdlib.h><br />#define SERVER_PORT_A 11111// 伺服器連接埠A<br />#define SERVER_PORT_B 22222// 伺服器連接埠B<br />typedef struct tagSERVER// 伺服器<br />{<br />char* ip;// ip地址<br />int nPort;// 連接埠號碼<br />} SERVER, *PSERVER;<br />int SendData(SOCKET s, char *ip, int nPort, char *pData); // 發送資料到IP:nPort<br />int main(int argc, char **argv)<br />{<br />int i;<br />WSADATA wsaData;// socket資料<br />SOCKET sClient;// 用戶端套介面<br />char send_buf[] = "hello! I am LiangFei whoes SNO=06060734";// 發送的資料內容<br />int nSend; // 發送資料後的傳回值<br />// 伺服器<br />SERVER sers[] = {{"127.0.0.1", SERVER_PORT_A},<br />{"127.0.0.1", SERVER_PORT_B} };<br />int nSerCount = sizeof(sers) / sizeof(sers[0]); // 伺服器個數<br />if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)// 啟動socket<br />{<br />printf("failed to start up socket!/n");<br />return 0;<br />}</p><p>// 建立用戶端資料包套介面<br />sClient = socket(AF_INET, SOCK_DGRAM, 0);<br />if (sClient == INVALID_SOCKET)<br />{<br />printf("socket()/n");<br />return 0;<br />}<br />for (i = 0; i < nSerCount; i++)<br />{<br />nSend = SendData(sClient, sers[i].ip, sers[i].nPort, send_buf);// 發送資料<br />if (nSend == 0)// 發送失敗<br />{<br />return 0;<br />}<br />else if (nSend == SOCKET_ERROR)// 套介面出錯<br />{<br />printf("sendto()/n");<br />return 0;<br />}<br />}<br />closesocket(sClient);// 關閉套介面<br />WSACleanup(); // 卸載winsock<br />return 0;<br />}<br />int SendData(SOCKET s, char *ip, int nPort, char *pData)<br />{<br />sockaddr_in ser;// 伺服器端地址<br />ser.sin_family = AF_INET;// IP協議<br />ser.sin_port = htons(nPort);// 連接埠號碼<br />ser.sin_addr.s_addr = inet_addr(ip);// IP地址<br />int nLen = sizeof(ser);// 伺服器位址長度</p><p>return sendto(s, pData, strlen(pData) + 1, 0, (sockaddr*)&ser, nLen);// 向伺服器發送資料 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.