您的位置:首页 > 理论基础 > 计算机网络

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是一个没有记录边界的字节流协议。(没有边界哦),如果要发送的信息量很大的话,并不保证一次性接收完所有的信息,所以,要循环的接收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: