UNIX网络编程卷一:套接字联网API(学习笔记一)
2015-06-25 22:18
441 查看
UNIX网络编程卷一:套接字联网API(学习笔记一)
目的
在工作中,对于网络编程理解运用还是不够好,因此学习这边经典的书籍,加深自己对网络编程的理解。不管现在运用的的是ACE或者ZQT框架,最基本的还是套接字。背景
两个程序进行通信,与两个人进行通话想通的,若是两个人用不同言语进行谈话,那么就是鸡同鸭讲,完成不知其所云,而两个程序通信也是一样的,必须规定好交流的“协议”,其实“协议”就是一套准则,例如两个人都用普通话进行交流,普通话就是协议。TCP/IP协议
由于本书主要讲解TCP/IP协议,因此注重点也是TCP/IP,TCP/IP是用很广的协议。其实很多的网络程序,都是基于该协议。用Windows的API编写一个简单的TCP/IP程序(在书中是使用Linux的API完成的,由于用的是Windows,懒得换到Linux,所以就····)
服务端的代码
#include <iostream> #include <Windows.h> #include <time.h> #pragma comment(lib,"ws2_32.lib") using namespace std; #define PORT 4000 #define IP_ADDRESS "135.124.2.22" int main(int argc, char* argv[]) { WSADATA Ws; SOCKET ServerSocket, CientSocket; struct sockaddr_in LocalAddr, ClientAddr; int Ret = 0; int AddrLen = 0; //Init Windows Socket if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ) { cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl; return -1; } //Create Socket ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( ServerSocket == INVALID_SOCKET ) { cout<<"Create Socket Failed::"<<GetLastError()<<endl; return -1; } LocalAddr.sin_family = AF_INET; LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); LocalAddr.sin_port = htons(PORT); memset(LocalAddr.sin_zero, 0x00, 8); //Bind Socket Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr)); if ( Ret != 0 ) { cout<<"Bind Socket Failed::"<<GetLastError()<<endl; return -1; } Ret = listen(ServerSocket, 10); if ( Ret != 0 ) { cout<<"listen Socket Failed::"<<GetLastError()<<endl; return -1; } cout<<"服务端已经启动"<<endl; AddrLen = sizeof(ClientAddr); CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen); if ( CientSocket == INVALID_SOCKET ) { cout<<"Accept Failed::"<<GetLastError()<<endl; } cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl; //获取系统时间 time_t t = time(0); char szTime[64] = {0}; strftime(szTime,sizeof(szTime),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t)); //把系统时间发送给客户端 Ret = send(CientSocket, szTime, (int)strlen(szTime), 0); if ( Ret == 0 ) { cout<<"Send Info Complete!"<<endl; } else { cout<<"Send Info Err!"<<endl; } closesocket(ServerSocket); closesocket(CientSocket); WSACleanup(); return 0; }
客户端的代码
#include <iostream> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") using namespace std; #define IP_ADDRESS "135.124.2.22" #define PORT 4000 int main( int argc , char* argv[] ) { WSADATA ws; if ( WSAStartup(MAKEWORD(2,2),&ws) != 0 ) { cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl; return -1; } SOCKET CientSocket; CientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if ( INVALID_SOCKET == CientSocket ) { cout<<"create socket failed::"<<GetLastError()<<endl; return -1; } struct sockaddr_in ServerAddr; ServerAddr.sin_family = AF_INET; ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); ServerAddr.sin_port = htons(PORT); memset(ServerAddr.sin_zero, 0x00, 8); int Ret = 0; Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr)); if ( SOCKET_ERROR == Ret ) { cout<<"Connect Error::"<<GetLastError()<<endl; return -1; } else { cout<<"连接成功!"<<endl; } char RecvBuffer[MAX_PATH]; memset(RecvBuffer, 0x00, sizeof(RecvBuffer)); recv(CientSocket, RecvBuffer, MAX_PATH, 0) cout<<"接收到时间信息为:"<<SendBuffer<<endl; closesocket(CientSocket); WSACleanup(); return 0; }
当然前面的代码有很多的漏洞,比如Recv函数等等,但是这个也仅仅是一个小小例子,(但是代码要保护,,,,,,,,,)。
注意
使用TCP时必须小心,因为TCP是一个没有记录边界的字节流协议。(没有边界哦),如果要发送的信息量很大的话,并不保证一次性接收完所有的信息,所以,要循环的接收。相关文章推荐
- 局域网找不到其它电脑
- TCP/IP协议族-----15、传输控制协议(TCP)
- Linux网络编程综合运用之MiniFtp实现(七)
- php面试题之三——PHP网络编程(高级部分)
- TCP/IP协议族-----14.用户数据报协议(UDP)
- TCP与UDP传输数据量问题
- Android查看网络图片
- 附录二 3. 网络通讯故障
- 网络图片查看器
- Android中子线程网络查看器与Handler消息处理器
- iOS网络篇---使用NSSession 实现获取XML
- 结合彩信的发送过程介绍HTTP
- 网络图片查看器
- iOS网络篇---使用NSSession 实现post和get发送和接收,并实现字典的发送
- 网络上下载图片
- Java知多少(103)网络编程之IP地址和InetAddress类
- iOS网络篇---使用NSConnection 实现post和get发送和接收(同步和异步模式)
- 网络爬虫3-使用LIB_http库
- 网络爬虫2--PHP/CURL库(client URL Request Library)
- HttpServletRequest类的getAttribute()方法与getParameter()方法的区别