//服务端和客户端合并,使用多线程技术实现
#include <WinSock2.h>
#include <iostream>
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
const unsigned short PORT = 8008;
SOCKET sock;
//线程函数,实现接收函数
void RecMain(void *pM)
{
char s[256];
sockaddr_in sfrom = {0};
int slen = sizeof(sfrom);
int result;
while ((result=recvfrom(sock,s,sizeof(s),0,(sockaddr*)&sfrom,&slen)) >0)
{
s[result] = '\0';
cout << inet_ntoa(sfrom.sin_addr) << "," << htons(sfrom.sin_port)<<": "<< s <<endl;
}
}
int main()
{
WSADATA wd;
WORD wVer = MAKEWORD(2,2);
int result = WSAStartup(wVer, &wd);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET==sock)
{
cout << "socket函数错误!" << WSAGetLastError() << endl;
return -1;
}
struct sockaddr_in sa = {AF_INET, htons(PORT)};
result = bind(sock, (sockaddr*)&sa, sizeof(sa));
if (result==SOCKET_ERROR)
{
cout << "bind函数错误: " << WSAGetLastError() << endl;
}
else cout << "端口发布成功!" << PORT << endl;
_beginthread(RecMain,1024*1024,NULL);
char s[256];
sockaddr_in sfrom = {0};
int slen = sizeof(sfrom);
char IP[20];
while (1)
{
cout<<"请输入对方IP地址:"<<endl;
cin>>IP;
fflush(stdin);
cout << "请输入信息!"<<endl;
gets(s);
sa.sin_addr.S_un.S_addr = inet_addr(IP);
sa.sin_port = htons(PORT);
sendto(sock,s,strlen(s),0,(sockaddr*)&sa,sizeof(sa));
Sleep(100);
}
return 0;
}
本文介绍了一个简单的UDP聊天室程序的设计与实现。该程序利用WinSock进行网络通信,并通过多线程技术实现客户端和服务端的数据收发。程序首先初始化WinSock环境,创建套接字并绑定到指定端口,然后在一个独立的线程中不断接收来自客户端的消息,并在主线程中发送消息到指定的IP地址。

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



