UDP之socket程式設計例項
阿新 • • 發佈:2019-02-04
不講解了,要求讀者:
1. 知道UDP是什麼
2. 索求Windows環境下的socket程式設計函式
3. 已經配置好了編譯環境——在Tools-option-中的設定
客戶端程式碼
#include <stdio.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
bool BindSocket(SOCKET& socket,short port ,const char* Ip){
sockaddr_in address;
address.sin_family=AF_INET;
address.sin_addr.s_addr =inet_addr(Ip);
address.sin_port=htons(port);
if (SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ){
return false;
}
return true;
}
int main()
{
WORD wVersionRequested;
WSADATA wData;
int err;
int port; //客戶端埠號
int Otherport; //伺服器埠號
char IPaddr[18 ]; //客戶端Ip
char OtherIP[18]; //伺服器Ip
wVersionRequested = MAKEWORD( 1, 1 ); // 請求WinSock庫
err = WSAStartup( wVersionRequested, &wData );
if(err!=0) {return -1;} // 返回值為零時表示成功WSAStartup
SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0); //建立Socket
if (sockCli < 0){
cout << "socket creation failed" << endl;
return 0;
}
cout << "socket created" << endl;
cout << "請輸入本機IP:" << endl; //輸入客戶端IP和埠號
gets(IPaddr);
printf("請輸入本機埠號:\n");
cin >> port;
if(!BindSocket(sockCli,port,IPaddr)){ //將本地IP地址和埠號繫結到所建立的套接字上
cout << "Bind failed" << endl;
return 0;
}
cout << "Bind Socket success " << endl;
sockaddr_in address; //伺服器的IP和埠號
cout << "請輸入伺服器的IP" << endl;
cin >> OtherIP;
cout << "請輸入伺服器的埠號" << endl;
cin >> Otherport;
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(OtherIP);
address.sin_port=htons(Otherport);
char talk[100]="t";
for(int i=0;i<100;i++){ //傳送100個數據包
sendto(sockCli,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) );
}
closesocket(sockCli);
WSACleanup();
return 0;
}
伺服器程式碼:
#include <stdio.h>
#include <iostream>
// c++ include lib from windows
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
bool BindSocket(SOCKET& socket,short port ,const char* Ip){
sockaddr_in address;
// set address of socket from socket family AF_INET;
address.sin_family=AF_INET;
address.sin_addr.s_addr =inet_addr(Ip);// set machine IP;
address.sin_port=htons(port); // set machine port
// all above belong to net words;
if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ){
return false;
}
return true;
}
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
int port; //伺服器埠號
char IPaddr[18]; //伺服器Ip
sockaddr_in address;
int n=sizeof(struct sockaddr);
char talk[100]={0};
char buffer[100] = {0};
wVersionRequested = MAKEWORD( 1, 1 ); // 請求WinSock庫
err = WSAStartup( wVersionRequested, &wsaData );
if(err!=0) {return -1;}
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); //建立Socket
/* Something about socket return value. */
if(sockSrv < 0){
cout << "socket creation failed" << endl;
return 0;
}
cout << "socket created" << endl;
cout << "請輸入本機IP:" << endl;
cin >> IPaddr;
printf("請輸入本機埠號:\n");
cin >> port;
//cout << IPaddr << endl << port << endl;
while(! BindSocket(sockSrv,port,IPaddr)){ //將本地IP地址和埠號繫結到所建立的套接字上
cout << "Bind fail" << endl;
cout << "請輸入本機IP:" << endl;
cin >> IPaddr;
printf("請輸入本機埠號:\n");
cin >> port;
}
cout << "Bind Socket success " << endl;
/*這裡不知道對不對*/
int num =0;
// over-time setting, and ACKpp setting;
// more about recvfrom function;
while(1){ //接受來自客戶端的資料包
if(recvfrom(sockSrv,buffer, 100,0,(struct sockaddr*)&address,&n) == SOCKET_ERROR ) {
cout << "接收失敗" << endl;
}
else{
num++;
}
cout << num << endl;// output situation;
}
closesocket(sockSrv);
WSACleanup();
return 0;
}