#include <iostream> #include <WinSock2.h> #include <WS2tcpip.h> #include <Windows.h> #include <thread> #include <cstdio> #include <string>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#pragma region 全局变量
SOCKET client; sockaddr_in sai_client; sockaddr_in sai_server;
struct umsg { int type; char name[64]; char text[512]; };
#pragma endregion
#pragma region 依赖函数
void recvMessage() { while (1){ umsg msg; int len_server = sizeof(sockaddr); int len = recvfrom(client, (char*)&msg,sizeof(msg),0,(sockaddr*)&sai_server,&len_server); cout << msg.name << ": " << msg.text << endl; } }
#pragma endregion
int main() { cout << "我是客户端" << endl;
WSADATA wsaData; if (WSAStartup( MAKEWORD(2, 2), &wsaData )) { cout << "WSAStartup failed : " << GetLastError() << endl; }
client = socket( AF_INET, SOCK_DGRAM, 0 ); sai_client.sin_family = AF_INET; inet_pton(AF_INET, "192.168.1.105", &sai_client.sin_addr); sai_client.sin_port = htons(8090);
string name; getline(cin, name);
umsg msg; msg.type = 1; strncpy_s(msg.name, sizeof(msg.name), name.c_str(), 64); strncpy_s(msg.text, sizeof(msg.text), "", 512); sendto( client, (char*)&msg, sizeof(msg), 0, (sockaddr*) & sai_client, sizeof(sai_client) );
HANDLE h_recvMes = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)recvMessage, 0, 0, 0); if (!h_recvMes) { cout << "CreateThread failed :" << GetLastError() << endl; } while (1) { string content; getline(cin, content); if (content == "quit") { msg.type = 2; sendto(client, (char*)&msg, sizeof msg, 0, (struct sockaddr*) & sai_client, sizeof(sai_client)); closesocket(client); WSACleanup(); return 0; }
msg.type = 3; strncpy_s(msg.text, sizeof(msg.text), content.c_str(), 512); sendto( client, (char*)&msg, sizeof(msg), 0, (sockaddr*) & sai_client, sizeof(sai_client) ); }
getchar(); return 0; }
|