VC++ 使用socket基于TCP、UDP通信
(2012-12-18 13:05:36)
标签:
socketbindlistensendrecv |
分类: TCP/IP |
首先包含头文件:
closesocket(m_socket);
return FALSE;
closesocket(m_socket);
return FALSE;
SOCKADDR_IN
SocketSendIn;
#include
<winsock.h>
链接winsock库
#pragma comment(lib,"ws2_32.lib")
#define MAX_MSG_LEN 1500 //最大的消息长度(MTU)
TCP方式通信(服务端):
1、加载SOCKET库
WSADATA wsa;
if (WSAStartup(MAKEWORD(1,1),&wsa) !=
0)
{
return FALSE; //加载失败
}
2、创建SOCKET
SOCKET
m_socket=socket(AF_INET,SOCK_STREAM,0);//TCP流式
3、将SOCKET绑定到IP和端口
//配置监听地址、绑定监听端口
SOCKADDR_IN Sersock;//用于服务器的监听SOCKET
ZeroMemory(&Sersock,sizeof(Sersock));
Sersock.sin_addr.S_un.S_addr =
htonl(INADDR_ANY);//所有可用IP
Sersock.sin_family = AF_INET;
Sersock.sin_port = htons(usPort);//端口号
int nbind = bind(m_socket,(SOCKADDR
*)&Sersock,sizeof(SOCKADDR));
if (SOCKET_ERROR==nbind)
{
}
4、创建线程,设置创建的SOCKET为监听模式等待连接请求
listen(m_socket,5);
5、使用accept函数接收到一个请求后(在接收到请求后才会返回),将创建一个与客户端新的SOCKET。
6、使用新的SOCKET与客户端send/recv通信。
7、关闭本次连接
SOCKADDR_IN
addrClient;
int len=sizeof(SOCKADDR);
char szrecvbuf[MAX_MSG_LEN];
char szsendBuf[50];
ZeroMemory(szrecvbuf,sizeof(szrecvbuf));
ZeroMemory(szsendBuf,sizeof(szsendBuf));
SOCKET sockSer;
while(TRUE)
{
//用accept函数接收客户方的连接
sockSer=accept(m_socket,(SOCKADDR*)&addrClient,&len);
if (INVALID_SOCKET==sockSer)
continue;
sprintf(szsendBuf,"Welcome %s to
This!",inet_ntoa(addrClient.sin_addr));
//在客户方套接字clientSocket上使用send发送数据
send(sockSer,szsendBuf,strlen(szsendBuf)+1,0);
//接收的数据
recv(sockSer,szrecvbuf,50,0);
psocket->m_strData.Format(_T("IP:%s,端口:%d
说:%s"),
inet_ntoa(addrClient.sin_addr),addrClient.sin_port,szrecvbuf);
//::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));//(给窗口发消息,通知)
//关闭本次连接
closesocket(sockSer);
//休息100S
Sleep(100);
}
8、关闭SOCKET和释放SOCKET库
//关闭socket
closesocket(m_socket);
WSACleanup();
TCP方式通信(客户端):
1、加载SOCKET库
WSADATA wsa;
if (WSAStartup(MAKEWORD(1,1),&wsa) !=
0)
{
return FALSE; //加载失败
}
2、创建SOCKET
SOCKET
m_socket=socket(AF_INET,SOCK_STREAM,0);//TCP流式
3、向服务端发送连接请求
SOCKADDR_IN SocketSendIn;
SocketSendIn.sin_family = AF_INET;
SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);
SocketSendIn.sin_port = htons(m_usRemotePort);
char szBuf[50];
//先建立连接
int nRet = connect(m_socket,(SOCKADDR*)&SocketSendIn,sizeof(SOCKADDR));
if (nRet==SOCKET_ERROR)
{
return -1;
}
4、使用recv/send与服务器通信
nRet = recv(m_socket,szBuf,sizeof(szBuf),0);
if (nRet==0)//超时
{
return -2;
}
//开始发送数据
send(m_socket,m_strData.GetBuffer(0),m_strData.GetLength(),0);
5、关闭SOCKET和释放SOCKET库
//关闭socket
closesocket(m_socket);
WSACleanup();
UDP方式通信(服务端):
1、加载SOCKET库
WSADATA wsa;
if (WSAStartup(MAKEWORD(1,1),&wsa) !=
0)
{
return FALSE; //加载失败
}
2、创建SOCKET
SOCKET
m_socket=socket(AF_INET,SOCK_DGRAM,0);//UDP方式
3、将SOCKET绑定到IP和端口
//配置监听地址、绑定监听端口
SOCKADDR_IN
Sersock;//用于服务器的监听SOCKET
ZeroMemory(&Sersock,sizeof(Sersock));
Sersock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//所有可用IP
Sersock.sin_family
= AF_INET;
Sersock.sin_port =
htons(usPort);//端口号
int nbind =
bind(m_socket,(SOCKADDR
*)&Sersock,sizeof(SOCKADDR));
if
(SOCKET_ERROR==nbind)
{
}
4、创建线程,recvfrom在创建的SOCKET上接收客户端消息
SOCKADDR_IN sockRecv;
int nlen = sizeof(SOCKADDR);
char szrecvbuf[MAX_MSG_LEN];
ZeroMemory(szrecvbuf,sizeof(szrecvbuf));
int nrecv;
while (TRUE)
{
nrecv=recvfrom(m_socket,szrecvbuf,sizeof(szrecvbuf),0,(SOCKADDR
*)&sockRecv,&nlen);
if (SOCKET_ERROR == nrecv)
break;
psocket->m_strData.Format(_T("IP:%s,端口:%d
说:%s"),
inet_ntoa(sockRecv.sin_addr),sockRecv.sin_port,szrecvbuf);
//::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));//发消息
//休息100S
Sleep(100);
}
5、关闭SOCKET和释放SOCKET库
//关闭socket
closesocket(m_socket);
WSACleanup();
UDP方式通信(客户端):
1、加载SOCKET库
WSADATA wsa;
if (WSAStartup(MAKEWORD(1,1),&wsa) !=
0)
{
return FALSE; //加载失败
}
2、创建SOCKET
SOCKET
m_socket=socket(AF_INET,SOCK_DGRAM,0);//UDP方式
4、创建线程,使用sendto给服务端发消息
SocketSendIn.sin_family = AF_INET;
SocketSendIn.sin_addr.S_un.S_addr =
htonl(m_ulRemoteIP);
SocketSendIn.sin_port =
htons(m_usRemotePort);
int nSenlen=m_strData.GetLength()+1;
sendto(SocketSend,m_strData,nSenlen,0,(SOCKADDR
*)&SocketSendIn,sizeof(SOCKADDR));
5、关闭SOCKET和释放SOCKET库
//关闭socket
closesocket(m_socket);
WSACleanup();