18,356
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <WinSock2.h>
#include <MSWSock.h>
#pragma comment(lib, "ws2_32.lib")
#include <list>
#include <vector>
#include <string>
#include <iostream>
DWORD WINAPI EchoProc(LPVOID pVoid)
{
SOCKET ReceivingSocket = (SOCKET)pVoid;
char szRecvBuf[8193]={0};
sockaddr_in SenderAddr;
int nAddrLen = sizeof(SenderAddr);
int nRecvdBytes = 0;
int Ret = 0;
while(true)
{
if((nRecvdBytes = recvfrom(ReceivingSocket, szRecvBuf, 8192, 0, (sockaddr*)&SenderAddr, &nAddrLen)) == SOCKET_ERROR)
{
cout<<"ERROR: recvfrom failed with error: " <<WSAGetLastError() <<endl;
break;
}
else
{
szRecvBuf[nRecvdBytes] = 0;
cout<<szRecvBuf<<endl;
}
Ret = sendto(ReceivingSocket, szRecvBuf, nRecvdBytes, 0, (SOCKADDR *)&SenderAddr, nAddrLen);
if(SOCKET_ERROR == Ret)
{
cout<<"ERROR: sendto failed with error: " <<WSAGetLastError() <<endl;
break;
}
}
closesocket(ReceivingSocket);
WSACleanup();
return 0;
}
DWORD WINAPI RecvProc(LPVOID pVoid)
{
SOCKET ReceivingSocket = (SOCKET)pVoid;
char szRecvBuf[8193]={0};
sockaddr_in SenderAddr;
int nAddrLen = sizeof(SenderAddr);
int nRecvdBytes = 0;
int Ret = 0;
while(true)
{
if((nRecvdBytes = recvfrom(ReceivingSocket, szRecvBuf, 8192, 0, (sockaddr*)&SenderAddr, &nAddrLen)) == SOCKET_ERROR)
{
cout<<"ERROR: recvfrom failed with error: " <<WSAGetLastError() <<endl;
break;
}
else
{
szRecvBuf[nRecvdBytes] = 0;
cout<<szRecvBuf<<endl;
}
}
closesocket(ReceivingSocket);
WSACleanup();
return 0;
}
SOCKET sock = INVALID_SOCKET;
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
sockaddr_in sockaddr;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP );
BOOL bNewBehavior = FALSE;
DWORD dwBytesReturned;
WSAIoctl(sock, SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL);
int mode = 0;
SELECT_MODE:
cout << "输入模式:0服务端 1客户端" << endl;
cin>>mode;
if (mode == 0)
{
int port = 0;
cout << "输入监听端口" << endl;
cin>>port;
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
sockaddr.sin_addr.S_un.S_addr = htons(INADDR_ANY);
if(bind(sock, (SOCKADDR*)&sockaddr, sizeof(sockaddr)) != SOCKET_ERROR)
{
HANDLE hThread = CreateThread(NULL, 0, EchoProc, (void*)sock, 0, NULL);
char q = 0;
while (true)
{
cout<<"press q to quit"<<endl;
cin>>q;
if (q == 'q')
{
closesocket(sock);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
break;
}
}
}
}
else if (mode == 1)
{
string ip;
int port = 0;
sockaddr_in addr;
addr.sin_family = AF_INET;
SELECT_IP:
cout << "输入服务IP" << endl;
cin>>ip;
PHOSTENT phost = gethostbyname(ip.c_str());
if (phost == NULL)
{
goto SELECT_IP;
}
else
{
addr.sin_addr.S_un.S_addr = *(u_long *) phost->h_addr_list[0];; //inet_addr(ip.c_str());
}
cout<<"输入端口"<<endl;
cin>>port;
addr.sin_port = htons(port);
cout<<"输入要发送的数据"<<endl;
sockaddr_in bind;
bind.sin_addr.S_un.S_addr = htons(INADDR_ANY);
bind.sin_port = htons(port-1);
bind.sin_family = AF_INET;
::bind(sock, (SOCKADDR*)&bind, sizeof(bind));
HANDLE hThread = CreateThread(NULL, 0, RecvProc, (void*)sock, 0, NULL);
char q = 0;
cout<<"press q to quit"<<endl;
while (true)
{
string buffer;
cin>>buffer;
int sendResult = sendto(sock, buffer.c_str(), buffer.size(), 0, (SOCKADDR*)&addr, sizeof(addr));
cin>>q;
if (q == 'q')
{
closesocket(sock);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
break;
}
}
}
else
{
cout << "输入正确的的模式" << endl;
goto SELECT_MODE;
}
return nRetCode;
}