不讲解了,要求读者:
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;
}