#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
char g_ip[20]; //对方ip地址
DWORD WINAPI Receive(
LPVOID lpParameter // thread data
)
{
SOCKET *psock = (SOCKET*)lpParameter;
char buf[100];
SOCKADDR_IN recv_addr;
int len = sizeof(SOCKADDR);
char ip[30];
while (1)
{
recvfrom(*psock, buf, 100, 0, (SOCKADDR*)&recv_addr, &len);
strcpy(ip, inet_ntoa(recv_addr.sin_addr));
cout << ip << " say:" << buf << endl;
}
return 0;
}
DWORD WINAPI Sendto(LPVOID lpParameter)
{
SOCKET *psock = (SOCKET*)lpParameter;
char buf[100];
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr(g_ip);
addr.sin_port = htons(6000);
while (1)
{
cin.getline(buf, 100);
sendto(*psock, buf, 100, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return 0;
}
cout << "please input ip:";
cin >> g_ip; //对方ip地址
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addr.sin_port = htons(6000);
if (bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "bind fail!" << endl;
return 0;
}
HANDLE hThreadRecv = CreateThread(NULL, 0, Receive, &sock, 0, NULL); //接收消息线程
HANDLE hThreadSend = CreateThread(NULL, 0, Sendto, &sock, 0, NULL); //发送小时线程
WaitForSingleObject(hThreadRecv, INFINITE); //阻塞主线程
return 0;
}
socket聊天程序(多线程,控制台)
最新推荐文章于 2017-03-15 22:22:30 发布