|
 
|
【教学视频】《C语言也能干大事》第十一节:Socket网络编程
【秘籍:免费获得大量鹏币】| 【立即购买鹏币(仅需3 元)】
帖子 只需购买一次即可以永久使用,不需要每次访问的时候都购买。购买后将会看到如下的视频、资料等下载地址
本主题需向作者支付 30 鹏币 才能浏览
购买主题
已购买人数:629 记录
未购买此贴可以在线观看不清晰版的视频格式:
http://player.youku.com/player.php/sid/XNzQ5NzQ3MDQ=/v.swf
购买此贴后可以得到清晰版的下载地址
板书:
这节课是自己动手写QQ、自己动手写飞鸽传书的基础,以后想从事网络开发、信息系统开发、游戏开发、嵌入式系统开发等的同学必须学习。
演示一个简单的和网易Email服务器对话的过程。
1、网络基本概念
讲解QQ的基本原理
讲解浏览器上网的基本原理
服务器:Server。提供服务的计算机。
客户端:Client。和服务器端交互的一个设备。
IP地址:计算机在网络中的地址。相当于每个家庭的电话。211.97.1.2
别名、域名:www.RuPeng.com。域名就相当于你家的地址。问114,你家的电话(告诉地址)
DNS:网络中的114。Domain Name System。
端口:Port。不同的程序连接服务器时候用的插座。(程序和服务器通信的时候的一个开得的一个口子)
Socket(套接字):导线、网络连接。
2、
WinSock、WinSocket。
Socket:平台无关的。Socket标准。所有操作系统都实现了这个标准。Send、recv。。。标准的。一通百通!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
WinSock:添加了一些Windows独有的函数。而且不用这些函数的话Socket程序还跑不起来。羞臊微软!!!
WinSock编程:平台无关,一通百通。WSA(Windows Socket API)
Sz1.tencent.com
Sz2.tencent.com
3、
LastError
调用WindowsAPI的时候,每步执行完毕都会把执行结果放到LastError中去,所以应该在函数执行完毕立即去取。
DeleteFile(f1)
DeleteFile(f2)
GetLastError()
LastError只能容纳一个错误码
DeleteFile(f1)
GetLastError()
DeleteFile(f2)
GetLastError()
错误码。2233、344555
FormatMessage:把错误码转换为错误消息。
Windows错误处理
GetLastError- void ShowError()
- {
- TCHAR* lpMsgBuf;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| //自动分配消息缓冲区
- FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
- NULL,GetLastError(), //获取错误信息标识
- MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//使用系统缺省语言
- (LPTSTR)&lpMsgBuf, //消息缓冲区
- 0,
- NULL);
- MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR);
- }
复制代码 在.h中声明函数,在.c中实现!!!
都会有哪些错误?
4、模板代码:
(1)、添加winsock2.h
(2)、连接库“wsock32”。怎么知道添加它呢?
(3)、模板代码- WSADATA wsaData;
- //初始化Socket库
- WSAStartup(MAKEWORD(2,0),&wsaData);
- //创建一根电线
- SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- SOCKADDR_IN sa;
- sa.sin_family=AF_INET;
- //设置电线连接服务器端的端口
- sa.sin_port = htons(IPPORT_SMTP);
- //123.125.50.135是ping smtp.163.com出来的,后面会讲使用gethostbyname来直接从
- //主机名得到ip地址
- sa.sin_addr.S_un.S_addr = inet_addr("123.125.50.135");
- //为什么不用设置客户端的端口,难道不需要客户端的端口吗?
- if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
- {
- ShowError();
- return;
- }
- //做事情。把大象放冰箱总共分几步
- closesocket(sock);
- WSACleanup();
复制代码 QQ服务器的端口8888。需要指定客户端的端口是9999.
端口有一个特点:排他性!端口已经被别的程序占用,不能再用这个端口。
开两个QQ。11111111111
22222222222 9999。如果端口可以被多个程序使用的话,QQ聊天服务器发过来的消息被多个QQ收到。很荒谬! 排他性!
如果在程序里写死了客户端用的端口。。。所以才需要Socket替客户端动态分配一个端口。所以不需要在程序中显示指定客户端的端口号!
客户端向服务器端发消息:send
服务器端想客户端发消息,客户端这边应该接收,recv。(receive)
SMTP服务器,你连上来以后服务器端主动向你发一条消息
recv(sock,buffer,256,0);
第一个是使用的socket,“导线”,套接字
接收数据的缓冲区的指针
接收数据的缓冲区的大小
0
send(sock,cQuit,lstrlen(cQuit),0);
第一个是使用的socket,“导线”,套接字
接收数据的缓冲区的指针
接收数据的缓冲区的大小
0- (4)一上来人家就主动和你唠嗑:
- char buffer[256];
- ZeroMemory(buffer,sizeof(buffer)/sizeof(char));
- //接收问候语
- recv(sock,buffer,256,0);
- MessageBox(hwnd,buffer,"",0);
- (5)朋友再见
- //注意不能忘了末尾的回车
- TCHAR cQuit[] = "QUIT\n";
- send(sock,cQuit,lstrlen(cQuit),0);
- ZeroMemory(buffer,sizeof(buffer)/sizeof(char));
- //接收GoodBye
- recv(sock,buffer,256,0);
- MessageBox(hwnd,buffer,"",0);
复制代码
购买主题
已购买人数:629 记录
|