windows TCP socket在C++下的编程入门 7
2015-12-22 13:10
633 查看
发送和接收数据
看到这里,你所看到的服务器都是聋哑的,也就是说它并不能再现实中帮助你做很多事情,所以让我们来学习怎么样适当的并且有效率的和我们所连接的电脑打交道。不管怎么样,和以往一样,在我们遇到困难的时候又有几个API函数来帮忙解决困难。
// 发送文本数据给远程电脑
int PASCAL send (SOCKET,const char*,int ,int );
//从远程电脑接收输入文本
int PASCAL recv(SOCKET,char*,int ,int )
//高等函数允许你和一个唯一的确定的电脑交流当有很多的电脑都连接相同的服务的时候
int PASCAL sendto (SOCKET,const char *,int ,int ,const struct sockaddr *,int );
int PASCAL recvfrom(SOCKET ,char*,int ,int ,struct sockaddr*, int *);
如果你不是使用一个异步的服务器,那你不得不把 recv() 函数放到一个计数函数中去,它不断的检查输入的数据,但这并不是一个优雅的解决方案,另一方面,你可以很聪明的设置一个异步服务器,然后你不得不把你的 FD_READ 中的 recv() 代码放到你的信息处理程序中去。当有输入数据的时候,你将会被通知,没有比这更简单的方法了,
当我们在做检测的时候,一个缓冲池必须被建立来存放这个检测活动,然后一个指向这个缓冲池的指针被传递给 recv() .在这个函数被返回之后,这文本应该很尽职的待在缓冲池等待被调用,下面是源代码。
case FD_READ:
{
char buffer[80];
memset(buffer ,0,sizeof(buffer)); //清空buffer
//把输入文本放入到缓冲池,你能在文本框显示它
//MessageBox(hwnd, Buffer,"captured Text...",MB_OK);
}
break;
现在你能够从一个远程计算机或者服务器接收一个输入文本,我们服务器现在就只缺回复的能力了,或者 发送数据给一个远程的电脑,这可能是 Winsock 最简单以及最明显的程序,但是如果你像我一样想要弄清楚每一步是怎么样的,下面就教你正确的使用 send() :
char *szpText;
//为在你的文本编辑器的文本分配内存并检索文本
// 查看源代码,然后传递指针给它
send (s,szpText, len_of_text,0 );
为了简洁起见,上面的代码片段都只是为了给你一个使用 send() 函数的大致的思路,想要看全部的代码,请下载样例源代码。
有一个比较容易忽略的点就是,在有些时候 简单的 send() 和 receive() 函数不能够适应你的需求,这会发生在你同时从多个不同的信息源建立多个连接的时候(还记得吗。,当我们调用 listen() 函数的时候,我们传递 SOMAXCONN 来允许最大可能连接的数量)以及你需要发送数据给一个特殊的电脑而不是所有的电脑的时候,如果你够机智,你可能注意到了2个在 send() 和 receive()下额外的API函数,sendto()和receivefrom();
这2个API允许你和合任何一个远程的计算机交流而不tripping your hand 给其他任何已经连接的。在这些函数中,在这些高级函数中有一个额外的参数接收一个指针给 sockaddr_in 结构,你能使用这个参数来唯一指定任何一个你想要连接的远程电脑的IP地址。这是一个很重要的技巧来判断你不是建立的是一个成熟的聊天软件,或者判断其他一些类似的。但是在教你这些函数怎么工作的基础之前,我将让你自己先试着解决看看(讨厌作者这样吗? 这是因为我们自己没有一些线索。但是真的如果我们决定这么做了以后应该不会很难才对)
最后一些注意事项
现在你应该对 Windows sockets有了相当的理解了,或者相当讨厌它了。但无论如何,如果你想要寻找比我这里更好的讲解资料,请看一看这篇文章给你的例子的源代码,练习将会比看更多的文章给你带来更多的好处。
另外,我认为如果你只是粘贴代码或者编译你在网上找到的其他人的代码而不是自己动手去敲得话,那么你将不会得到很好的理解。写代码很艰难我知道。但是如果你花费时间去做了,你在以后的将会省去很多麻烦。
祝你愉快,请让我知道你读完这篇文章以后的感想
文章源地址
http://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin
看到这里,你所看到的服务器都是聋哑的,也就是说它并不能再现实中帮助你做很多事情,所以让我们来学习怎么样适当的并且有效率的和我们所连接的电脑打交道。不管怎么样,和以往一样,在我们遇到困难的时候又有几个API函数来帮忙解决困难。
// 发送文本数据给远程电脑
int PASCAL send (SOCKET,const char*,int ,int );
//从远程电脑接收输入文本
int PASCAL recv(SOCKET,char*,int ,int )
//高等函数允许你和一个唯一的确定的电脑交流当有很多的电脑都连接相同的服务的时候
int PASCAL sendto (SOCKET,const char *,int ,int ,const struct sockaddr *,int );
int PASCAL recvfrom(SOCKET ,char*,int ,int ,struct sockaddr*, int *);
如果你不是使用一个异步的服务器,那你不得不把 recv() 函数放到一个计数函数中去,它不断的检查输入的数据,但这并不是一个优雅的解决方案,另一方面,你可以很聪明的设置一个异步服务器,然后你不得不把你的 FD_READ 中的 recv() 代码放到你的信息处理程序中去。当有输入数据的时候,你将会被通知,没有比这更简单的方法了,
当我们在做检测的时候,一个缓冲池必须被建立来存放这个检测活动,然后一个指向这个缓冲池的指针被传递给 recv() .在这个函数被返回之后,这文本应该很尽职的待在缓冲池等待被调用,下面是源代码。
case FD_READ:
{
char buffer[80];
memset(buffer ,0,sizeof(buffer)); //清空buffer
//把输入文本放入到缓冲池,你能在文本框显示它
//MessageBox(hwnd, Buffer,"captured Text...",MB_OK);
}
break;
现在你能够从一个远程计算机或者服务器接收一个输入文本,我们服务器现在就只缺回复的能力了,或者 发送数据给一个远程的电脑,这可能是 Winsock 最简单以及最明显的程序,但是如果你像我一样想要弄清楚每一步是怎么样的,下面就教你正确的使用 send() :
char *szpText;
//为在你的文本编辑器的文本分配内存并检索文本
// 查看源代码,然后传递指针给它
send (s,szpText, len_of_text,0 );
为了简洁起见,上面的代码片段都只是为了给你一个使用 send() 函数的大致的思路,想要看全部的代码,请下载样例源代码。
有一个比较容易忽略的点就是,在有些时候 简单的 send() 和 receive() 函数不能够适应你的需求,这会发生在你同时从多个不同的信息源建立多个连接的时候(还记得吗。,当我们调用 listen() 函数的时候,我们传递 SOMAXCONN 来允许最大可能连接的数量)以及你需要发送数据给一个特殊的电脑而不是所有的电脑的时候,如果你够机智,你可能注意到了2个在 send() 和 receive()下额外的API函数,sendto()和receivefrom();
这2个API允许你和合任何一个远程的计算机交流而不tripping your hand 给其他任何已经连接的。在这些函数中,在这些高级函数中有一个额外的参数接收一个指针给 sockaddr_in 结构,你能使用这个参数来唯一指定任何一个你想要连接的远程电脑的IP地址。这是一个很重要的技巧来判断你不是建立的是一个成熟的聊天软件,或者判断其他一些类似的。但是在教你这些函数怎么工作的基础之前,我将让你自己先试着解决看看(讨厌作者这样吗? 这是因为我们自己没有一些线索。但是真的如果我们决定这么做了以后应该不会很难才对)
最后一些注意事项
现在你应该对 Windows sockets有了相当的理解了,或者相当讨厌它了。但无论如何,如果你想要寻找比我这里更好的讲解资料,请看一看这篇文章给你的例子的源代码,练习将会比看更多的文章给你带来更多的好处。
另外,我认为如果你只是粘贴代码或者编译你在网上找到的其他人的代码而不是自己动手去敲得话,那么你将不会得到很好的理解。写代码很艰难我知道。但是如果你花费时间去做了,你在以后的将会省去很多麻烦。
祝你愉快,请让我知道你读完这篇文章以后的感想
文章源地址
http://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin
相关文章推荐
- Android中使用OkHttp框架
- Java 神经网络模型 待续
- HTTP 的重定向301,302,303,307
- iOS判断网络是否连接
- 虚拟机centos配置网络
- Http状态码详解
- 1_网络基础 OSI网际互联(上)
- iOS开发系列--网络开发
- TCP三次握手和Time-Wait状态
- 高性能Java网络框架 MINA
- TCP/IP、Http、Socket的区别
- servlet-------HttpServletRequest对象
- 网络打印机的一般故障
- NSURLSession下载与缓存
- 安全科普:理解SSL(https)中的对称加密与非对称加密
- HTTP协议基础
- 网络编程概念总结(笔记)-------来自传智播客视频
- http://blog.chinaunix.net/uid-20484604-id-1941290.html
- TCP server和client的一些测试
- C++使用CHttpFile实现Http请求