您的位置:首页 > 其它

局域网聊天(UDP)

2011-06-24 10:06 253 查看
#include "windows.h"
#include "winsock.h"
#include "iostream"
using namespace std;

#pragma comment(lib, "ws2_32.lib")

DWORD WINAPI Recv(LPVOID lParam)
{
SOCKET * sock = (SOCKET *)lParam;
char buff[512];
int len;
DWORD IP = GetIP();

SOCKADDR_IN addr;

len = sizeof(SOCKADDR);
while(1)
{
ZeroMemory(buff, 512);
recvfrom(*sock, buff, 512, 0, (SOCKADDR*)&addr, &len);

if (addr.sin_addr.S_un.S_addr != IP)
{
if(len >= 0)
cout<<buff<<endl;
}

}

return 0;
}

int main()
{
WSAData wsadata;
WORD Vesion;
char name[20];

bool nBuflen = true;
int optlen = sizeof(nBuflen);

Vesion = MAKEWORD(2, 2);
if(WSAStartup(Vesion, &wsadata))
return 1;

SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&nBuflen, optlen);    //设置为广播socket

SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = 7800;

SOCKADDR_IN addrto;
addrto.sin_addr.S_un.S_addr = INADDR_BROADCAST; // inet_addr("172.1.31.1");
addrto.sin_port = 7800;
addrto.sin_family = AF_INET;

if(SOCKET_ERROR == bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)))
cout<<"Error!"<<endl;

HANDLE hRecv = CreateThread(NULL, 0, Recv, &sock, 0, NULL);
CloseHandle(hRecv);

cout<<"请输入您的真实姓名:"<<endl;
cin>>name;
system("cls");
fflush(stdin);

char temp[1024];
char buff[512];
while(1)
{
ZeroMemory(buff, 512);
cin.getline(buff, 512);
sprintf(temp, "%s:%s", name, buff);

if(strcmp(buff, "exit") == 0)
break;

sendto(sock, temp, 1024, 0, (SOCKADDR*)&addrto, sizeof(SOCKADDR));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: