加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VC++ 使用socket基于TCP、UDP通信

(2012-12-18 13:05:36)
标签:

socket

bind

listen

send

recv

分类: TCP/IP
首先包含头文件:
#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) 
 closesocket(m_socket);
 return FALSE; 
}

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) 
 closesocket(m_socket);
 return FALSE; 
}

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给服务端发消息
 SOCKADDR_IN SocketSendIn; 
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();

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有