C++socket学习笔记

由于项目的需要,在学习使用socket使用socket,记录自己碰到的一个问题。

MFC编程中,习惯使用CSocket,而在控制台程序中只能使用SOCKET套接字。若全为MFC,则其通信比较容易.

服务端创建监听套接字,并监听:

 CListenSocket *cLisSoc = new CListenSocket();

  cLisSoc->Create(5555,SOCK_STREAM,”127.0.0.1“); 

cLisSoc->Listen();
客户端创建客户端套接字,连接

CClientSocket *cSock = new CClientSocket();

cSock->Create();

cSock->Connect("127.0.0.1",5555);

其中CListenSocket,CClientSocket均为继承于CSocket的自定义类。

这样可以完成套接字的连接。

然,要将MFC的CSocket和控制台的SOCKET连接 C1:

客户端:

 SOCKET clientS = socket(AF_INET,SOCK_STREAM,0);
 sockaddr_in sockSerClient;
 sockSerClient.sin_family = AF_INET;
 sockSerClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 sockSerClient.sin_port = 5555;
 int len = sizeof(sockaddr);
 int a = connect(clientS,(sockaddr *)&sockSerClient,len);

服务端:

 CListenSocket *cLisSoc = new CListenSocket();

 cLisSoc->Create(5555,SOCK_STREAM,”127.0.0.1“); 

cLisSoc->Listen();

这样会出现问题,在连接的时候会提示10061的错误,意思是强行拒绝连接。

在使用Create方法创建套接字的时候实际上已经调用了Bind的方法,如果再次调用Bind方法会提示10022的错误,意思是已经绑定。

显然这样连接存在错误。CSocket的Connect重载了两个方法:

BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );

BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );

若以CSocket创建客户端套接字:

 sockaddr_in sockSer;
 sockSer.sin_family = AF_INET;
 sockSer.sin_addr.S_un.S_addr = inet_addr(m_ipAddr.c_str());
 sockSer.sin_port = m_nPort;
 int len = sizeof(sockaddr);
 BOOL con = Connect((sockaddr *)&sockSer,len);

SOCKET创建服务端套接字:

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 7777;
addr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
bind(serSock, (sockaddr*)&addr,  sizeof(sockaddr_in));
listen(serSock, 5);  //5 表示同时允许有多少个连接请求

这样是可以连接的。这样看来,C1的解决方案也得使用SOCKET,而不用Create方法。最后查MSDN,找到解决方案:

客户端:

 SOCKET clientS = socket(AF_INET,SOCK_STREAM,0);
 sockaddr_in sockSerClient;
 sockSerClient.sin_family = AF_INET;
 sockSerClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 sockSerClient.sin_port = 5555;
 int len = sizeof(sockaddr);
 int a = connect(clientS,(sockaddr *)&sockSerClient,len);

服务端:

 CListenSocket *cLisSoc = new CListenSocket();

/***********代替Create***********************************/

sockaddr_in sockSer;

sockSer.sin_family = AF_INET;

sockSer.sin_addr.S_un.S_addr = inet_addr(ipAddr);
sockSer.sin_port = nPort;
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
cLisSoc->Attach(s);
int len = sizeof(sockaddr);
int a = cLisSoc->Bind((sockaddr*)&sockSer,len);
int b = GetLastError();

/*****************************************************/

 cLisSoc->Listen();

 

在我曾经的理解中,认为Create()方法应该做了上述的操作了的,在msdn中也说Create方法,会创建一个window socket并附加到这个对象当中的。创建完之后需要调用Bind,而实际使用过程中,调用了Create(),基本上不用调用Bind()方法,即使使用了,GetLastError()和提示10022的错误。至于为什么C1会不能连接,目前还没有想清楚,在解决之中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值