简易测试程序,用于测试使用socket 实现UDP.
程序结构简单,仅有相关函数的使用.旨在明确新手对于socket的学习方向.
服务器程序:
// SocketUDPSrv.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
//Initialize ws2_32.lib
WSADATA wsaData;
WORD wVerionRequested;
int ret;
wVerionRequested = MAKEWORD(2,2);
ret = WSAStartup(wVerionRequested,&wsaData);
if (ret == SOCKET_ERROR)
{
::MessageBox(NULL,"WSAStartup Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
cout << "Initialize ws2_32.lib...done..." << endl;
SOCKET srv_socket;
srv_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (srv_socket == SOCKET_ERROR)
{
::MessageBox(NULL,"socket Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
cout << "create socket...done..." << endl;
sockaddr_in srv_addr;
srv_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(6000);
ret = bind(srv_socket,(SOCKADDR *)&srv_addr,sizeof(srv_addr));
if (ret == SOCKET_ERROR)
{
cout << WSAGetLastError()<<endl;
::MessageBox(NULL,"bind Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
cout << "bind...done..." << endl;
cout << "receive data...";
char recv_buf[256];
sockaddr_in from_addr;
int fromlen = sizeof(SOCKADDR);
//ret = recvfrom(srv_socket,recv_buf,256,0,(SOCKADDR *)&from_addr,&fromlen);
int i = 0;
while(i < 3){
//ret = recvfrom(srv_socket,recv_buf,256,0,NULL,NULL);
ret = recvfrom(srv_socket,recv_buf,256,0,(SOCKADDR *)&from_addr,&fromlen);
if (ret == SOCKET_ERROR)
{
cout << WSAGetLastError()<<endl;
::MessageBox(NULL,"recvfrom Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
cout << recv_buf << endl;
i++;
}
cout <<"done...\n";
closesocket(srv_socket);
WSACleanup();
return 0;
}
客户端程序:
// SocketUDPClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData;
WORD wVerionRequested;
int ret;
wVerionRequested = MAKEWORD(2,2);
ret = WSAStartup(wVerionRequested,&wsaData);
if (ret == SOCKET_ERROR)
{
::MessageBox(NULL,"WSAStartup Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
SOCKET client_socket;
client_socket = socket(AF_INET,SOCK_DGRAM,0);
if (client_socket == SOCKET_ERROR)
{
::MessageBox(NULL,"socket Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
//²»ÐèÒªbind
//·þÎñÆ÷¶ËµÄµØÖ·ºÍ¶Ë¿Ú
sockaddr_in addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
char send_buf[256];
sprintf(send_buf,"Hello.....");
ret = sendto(client_socket,send_buf,strlen(send_buf) + 1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if (ret == SOCKET_ERROR)
{
cout << WSAGetLastError() << endl;
::MessageBox(NULL,"sendto Error","demon",MB_OK | MB_ICONERROR);
return -1;
}
cout << "done..." << endl;
closesocket(client_socket);
WSACleanup();
return 0;
}
本文介绍了一个简单的 UDP Socket 测试程序,包括服务器端和客户端的实现。该程序使用 C++ 编写,通过 Windows Sockets API 实现 UDP 数据包的发送与接收。适用于初学者学习 Socket 编程。
1468

被折叠的 条评论
为什么被折叠?



