inet_ntoa、inet_ntop、Inet_Ntop
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
//ws2_32.dll
using namespace std;
enum { PORT = 7890 };
int main()
{
WSADATA wd;
int n = WSAStartup(0x0703, &wd);
if (n)
return -1;
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); //想象一下fopen “wb” ,“rb”
if (INVALID_SOCKET == sock)
{//-1代表错误
cout << "socket句柄创建失败:" << WSAGetLastError() << endl;
return 0;
}
//0代表成功
sockaddr_in sa = { AF_INET };//绑定了0IP代表本机所有IP,0端口本机随机剩余的端口
n = bind(sock, (sockaddr*)&sa, sizeof(sa));
if (n)
{
cout << "bind端口失败:" << WSAGetLastError() << endl;
return -1;
}
char s[256];
while (true)
{
cout << "请输入一些文字来发送:";
cin >> s;
sa.sin_port = htons(PORT);
sa.sin_addr.S_un.S_addr = inet_addr("192.168.1.96");
sendto(sock, s, (int)strlen(s), 0, (sockaddr*)&sa, sizeof(sa));
}
return 0;
}
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
//ws2_32.dll
using namespace std;
enum { PORT = 7890 };
int main()
{
WSADATA wd;
int n = WSAStartup(0x0703, &wd);
if (n)
return -1;
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sock)
{//-1代表错误
cout << "socket句柄创建失败:" << WSAGetLastError() << endl;
return 0;
}
//0代表成功
sockaddr_in sa = { AF_INET,htons(PORT) };//IP清零代表本机所有IP
//sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
n = bind(sock, (sockaddr*) &sa, sizeof(sa));
if (n)
{
//perror("绑定失败:");
cout << "bind端口失败:" << WSAGetLastError() << endl;
return -1;
}
char s[256]{};
//char sIP[32];
//int nPort = 0;
int nLen = sizeof(sa);
while (true)
{
//n = recv(sock, s, sizeof(s)-1, 0);//返回值类似于fread,
n = recvfrom(sock, s, sizeof(s) - 1, 0, (sockaddr*)&sa, &nLen);
if (n <= 0)
break;
s[n] = '\0';
const char* p = inet_ntoa(sa.sin_addr);
cout <<p<< htons(sa.sin_port) << ":";
cout << s << endl;
//边界限制
}
closesocket(sock);
WSACleanup();
return 0;
}
2、多线程。涉及线程保护,连续输出的内容锁在一起
#include <iostream>
#include <process.h> // 包含 _beginthread 函数的头文件
using namespace std;
void threadFunc(void* arg)
{
char s[32];
int* p = (int*)arg;
cout <<' ' << (void*)s << endl;
//int n = *((int*)arg); // 将 void* 类型转换为 int*
while (true)
{
cout << *p << endl;
}
}
int main() {
const int num_threads = 5;
uintptr_t thread_handles[num_threads]; // 用于存储线程句柄的数组
int thread_args[num_threads]; // 用于存储线程参数的数组
for (int i = 0; i < num_threads; ++i) {
thread_args[i] = i;
thread_handles[i] = _beginthread(threadFunc,0, &thread_args[i]); // 启动一个新线程
}
getchar();
// 等待所有线程执行完毕
for (int i = 0; i < num_threads; ++i) {
_endthreadex(0); // 结束线程
}
return 0;
}
//线程回调函数
uintptr_t _beginthread( // NATIVE CODE
void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist
);
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <process.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
//ws2_32.dll
using namespace std;
enum { PORT = 0x2345 };
void recvProc(void* p)
{
//SOCKET* pSock = (SOCKET*)p;
SOCKET sock = *(SOCKET*)p;
sockaddr_in sa = { AF_INET,htons(PORT) };
char s[256];
int nLen = sizeof(sa);
while (true)
{
int n = recvfrom(sock, s, sizeof(s) - 1, 0, (sockaddr*)&sa, &nLen);
if (n <= 0)
break;
s[n] = '\0';
Sleep(100);//让当前线程休息
cout << "\n有人发来信息\n" << inet_ntoa(sa.sin_addr) << "-" << htons(sa.sin_port) << ":";
cout << s << endl;
}
}
int main()
{
WSADATA wd;
int n = WSAStartup(0x0703, &wd);
if (n)
return -1;
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sock)
{//-1代表错误
cout << "socket句柄创建失败:" << WSAGetLastError() << endl;
return 0;
}
//0代表成功
sockaddr_in sa = { AF_INET,htons(PORT) };//IP清零代表本机所有IP
n = bind(sock, (sockaddr*)&sa, sizeof(sa));
if (n)
{
cout << "bind端口失败:" << WSAGetLastError() << endl;
return -1;
}
_beginthread(recvProc, 0, &sock);
char s[256], sIP[32];
int nLen = sizeof(sa);
while (true)
{
//n = recv(sock, s, sizeof(s)-1, 0);//返回值类似于fread,
cout << "请输入要发送的目标IP:";
cin >> sIP;
cout << "请输入要发送的内容:";
cin >> s;
sa.sin_port = htons(PORT);
sa.sin_addr.S_un.S_addr = inet_addr(sIP);
sendto(sock, s, (int)strlen(s), 0, (sockaddr*)&sa, sizeof(sa));
//边界限制
}
closesocket(sock);
WSACleanup();
return 0;
}
s;
sa.sin_port = htons(PORT);
sa.sin_addr.S_un.S_addr = inet_addr(sIP);
sendto(sock, s, (int)strlen(s), 0, (sockaddr*)&sa, sizeof(sa));
//边界限制
}
closesocket(sock);
WSACleanup();
return 0;
}