基于TCP(面向连接)的Socket编程

一、客户端:

1、打开一个套接字(Socket);

2、发起连接请求(connect);

3、如果连接成功,则进行数据交换(read、write、send、recv);

4、数据交换完成,关闭连接(shutdown、close);

二、服务器端:

1、打开一个套接字(Socket);

2、将套接字绑定到服务器地址上(bind);

3、指定套接字为服务器套接字(listen),做好连接请求准备;

4、等待连接请求(connect);

5、如果连接请求到,则连接建立,进行数据交换(read、write、send、recv);

6、数据交换完成,关闭连接(shutdown、close);

基于UDP(面向无连接)的Socket编程

一、客户端\服务器端:

1、打开一个套接字(Socket);

2、将套接字绑定到指定的服务器地址和端口上(bind);

3、进行数据交换(read、write、send、recv);

4、数据交换完成,关闭连接(shutdown、close);

三、MFC对Socket的支持:

1、创建CAsyncSocket对象;

2、发送接收数据报(SendTo、RecvFrom);

3、连接服务器(Connect);

4、接收连接(Listen);

5、发送和接收流式数据(Send、Receive);

6、关闭套接字(Close);

7、差错处理(GetLastError)。

四、实例:网络聊天工具

客户端:

1、。。。。

2、利用类向导重载CAsyncSocket类,生成新的MySocket类。。

3、利用类向导重载CAsyncSocket的OnReceive(int nErrorCode)和OnSend(int nErrorCode)、OnConnect(int nErrorCode)函数。

void MySocket::OnReceive(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

//获取对话框指针

CTestApp*pApp=(CTestApp*)AfxGetApp();

CTestDlg*pDlg=(CTestDlg*)pApp->m_pMainWnd;

//往编辑框中插入消息

char *pbuf=new char[4096];

int ibufsize=4096;

int ircvd;

CString strrecvd;

ircvd=Receive(pbuf,ibufsize);

if(ircvd==SOCKET_ERROR)

{

pDlg->MessageBox("SOCKET_ERROR");

}

else

{

pbuf[ircvd]=NULL;

pDlg->m_recmsg+="服务器:";

pDlg->m_recmsg+=pbuf;

pDlg->m_recmsg+="\r\n";

pDlg->RefreshScreen();

}

delete pbuf;

CAsyncSocket::OnReceive(nErrorCode);

}

void MySocket::OnSend(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnSend(nErrorCode);

}

void MySocket::OnConnect(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

CTestApp*pApp=(CTestApp*)AfxGetApp();

CTestDlg*pDlg=(CTestDlg*)pApp->m_pMainWnd;

int iResult=nErrorCode;

CString buffer;

int namelen;

if(iResult!=0)

{

buffer.Format("连接服务器失败。\r\n");

pDlg->m_recmsg+=buffer;

}

else

{

namelen=sizeof(sockaddr_in);

buffer.Format("成功连接到服务器 %s:%d.\r\n",pDlg->m_ipstr,pDlg->m_port);

pDlg->m_recmsg+=buffer;

pDlg->GetDlgItem(IDC_SEND)->EnableWindow(TRUE);

pDlg->GetDlgItem(IDOK)->EnableWindow(TRUE);

}

pDlg->RefreshScreen();

CAsyncSocket::OnConnect(nErrorCode);

}

4、在C*Dlg类中

头文件中:

#include "MySocket.h"

MySocket m_socket;

CString m_ipstr;

.CPP文件中:

void CTestDlg::OnSend()

{

// TODO: Add your control notification handler code here

int ilen;

int isent;

UpdateData(TRUE);

if(m_msg!="")

{

ilen=m_msg.GetLength ();

isent=m_socket.Send(LPCTSTR(m_msg),ilen);

if(isent==SOCKET_ERROR)

{

MessageBox("连接失败,请重试!");

//     connect=false;

}

else

{

m_recmsg+="客户机:"+m_msg;

m_recmsg+="\r\n";

UpdateData(FALSE);

}

}

}

void CTestDlg::RefreshScreen()

{

UpdateData(false);

}

void CTestDlg::OnConnect()

{

if (!AfxSocketInit())

{

AfxMessageBox("IDP_SOCKETS_INIT_FAILED");

return ;

}

GetDlgItemText(IDC_IPADDRESS1,m_ipstr);

m_socket.m_hSocket=INVALID_SOCKET;

UpdateData(true);

BOOL flag=m_socket.Create();

if(!flag)

{

AfxMessageBox("SOCKET ERROR");

return;

}

m_socket.Connect(m_ipstr,m_port);

}

void CTestDlg::OnOK()

{

// TODO: Add extra validation here

m_socket.Close();

CDialog::OnOK();

}

服务器端:

1、。。。。

2、利用类向导重载CAsyncSocket类,生成新的MySocket类。。

3、利用类向导重载CAsyncSocket的OnReceive(int nErrorCode)和OnSend(int nErrorCode)函数。

void MySocket::OnReceive(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

CTestApp*pApp=(CTestApp*)AfxGetApp();

CTestDlg*pDlg=(CTestDlg*)pApp->m_pMainWnd;

//往列表框中插入消息

char *pbuf=new char[4096];

int ibufsize=4096;

int ircvd;

CString strrecvd;

ircvd=Receive(pbuf,ibufsize);

if(ircvd==SOCKET_ERROR)

{

pDlg->MessageBox("SOCKET_ERROR");

}

else

{

pbuf[ircvd]=NULL;

pDlg->m_msg+="客户机:";

pDlg->m_msg+=pbuf;

pDlg->m_msg+="\r\n";

pDlg->RefreshScreen();

}

delete pbuf;

CAsyncSocket::OnReceive(nErrorCode);

}

void MySocket::OnSend(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnSend(nErrorCode);

}

4、新建MyServerSocket类,并添加MySocket * m_socket;即接收请求后的套接字指针。

MySocket * m_socket;

void CMyServerSocket::OnAccept(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

CTestApp*pApp=(CTestApp*)AfxGetApp();

CTestDlg*pDlg=(CTestDlg*)pApp->m_pMainWnd;

//显示连接消息

pDlg->m_msg="客户机连接到服务器";

pDlg->m_msg+="\r\n";

pDlg->RefreshScreen();

pDlg->GetDlgItem(IDC_SEND)->EnableWindow(TRUE);

pDlg->GetDlgItem(IDOK)->EnableWindow(TRUE);

MySocket* psocket=new MySocket();

if(Accept(*psocket))

{

psocket->AsyncSelect(FD_READ);

m_socket=psocket;

}

else

{

delete psocket;

}

CAsyncSocket::OnAccept(nErrorCode);

}

5、C*Dlg类中

void CTestDlg::RefreshScreen()

{

UpdateData(false);

}

void CTestDlg::OnListen() //创建服务器

{

// TODO: Add your control notification handler code here

UpdateData(true);

if (!AfxSocketInit())

{

AfxMessageBox("IDP_SOCKETS_INIT_FAILED");

return ;

}

BOOL flag=m_serversocket.Create(m_port);

if(!flag)

{

AfxMessageBox("SOCKET ERROR");

return;

}

flag=m_serversocket.Listen(1);

if(!flag)

{

AfxMessageBox("SOCKET ERROR");

return;

}

SetDlgItemText(IDC_LISTEN,"正在监听");

}

void CTestDlg::OnSend()

{

// TODO: Add your control notification handler code here

int ilen;

int isent;

UpdateData(TRUE);

if(m_sendmsg!="")

{

ilen=m_sendmsg.GetLength ();

isent=m_serversocket.m_socket->Send(LPCTSTR(m_sendmsg),ilen);

if(isent==SOCKET_ERROR)

{

MessageBox("连接失败,请重试!");

}

else

{

m_msg+="服务器:"+m_sendmsg;

m_msg+="\r\n";

UpdateData(FALSE);

}

}

}

void CTestDlg::OnOK()

{

// TODO: Add extra validation here

m_sendmsg="服务器退出";

UpdateData(false);

OnSend();

m_serversocket.Close();

CDialog::OnOK();

}

基于TCP(面向连接)的Socket编程的更多相关文章

  1. 基于TCP/UDP的socket编程

    基于TCP(面向连接)的socket编程服务器端顺序: 1. 创建套接字(socket) 2. 将套接字绑定到一个本地地址和端口上(bind) 3. 将套接字设为监听模式,准备接收客户请求(liste ...

  2. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  3. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  4. 基于TCP协议的socket编程

    什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  5. C语言小项目-基于TCP协议和SOCKET编程的网络通信系统

    1.1 功能结构图   网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务 ...

  6. 基于TCP协议之socket编程

    #服务端 #导入一个socket模块 import socket #想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM #买了 ...

  7. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

  8. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  9. (4)socket的基础使用(基于TCP协议的并发编程)

    需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...

随机推荐

  1. Kubernetes基础概念及架构概述

    Kubernetes 架构 Kubernetes是一个全新的基于容器技术的分布式架构,虽然Kubernetes只有三年,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要发展成果.确切的 ...

  2. Sqlserver 数据库定时自动备份

    sqlserver 可以通过微软工具 SQL Server Management Studio  进行数据库定时自动备份,具体步骤如下: 1,打开SQL Server Management Studi ...

  3. Windows2012 要远程登录,你需要具有通过远程桌面服务进行登录的权限.

    直接说正题... 提示如下: 解决办法: gpedit进入策略组:计算机配置->Windows设置->安全设置->本地策略->用户权限分配,找到拒绝通过远程桌面服务登录,把里面 ...

  4. lnk快捷方式变记事本打开还原,桌面图标变lnk还原方法

    今天天碰到一坑爹问题,打开一个.ini文件自动设置用记事本打开,所有快捷方式都变成记事本打开了,如下图,网上找了一些方法. windows中LNK文件打开方式恢复 相信有些用户曾试过错误地把LNK文件 ...

  5. HDU 6362(求椭圆中矩形周长的期望 数学)

    题意是给定一个椭圆标准方程的a,b(椭圆的长半轴长和短半轴长),在[0,b]内取一个数,则过点(0,b)且平行于x轴的直线与椭圆交于两点,再将此两点关于x轴做对称点,顺次连接此四点构成矩形,求出这些矩 ...

  6. 三、文件IO——系统调用(续)

    3.2.4 read 函数--- 读文件 read(由已打开的文件读取数据) #include<unistd.h> ssize_t read(int fd, void * buf, siz ...

  7. luogu P3175 [HAOI2015]按位或

    传送门 如果每个位置上的数字的意义是这个位置被加进集合的最早时间,那么我们要求的就是集合中最大数的期望,使用Min-Max容斥,\(E(max(S))=\sum_{T\subset S}(-1)^{| ...

  8. Ubuntu18.04安装搜狗拼音输入法皮肤透明解决方法

    解决方法: 去搜狗输入法官网下载一个新的皮肤,然后右键用“搜狗输入法”打开,就解决了!!!

  9. python之MD5加密

    一. MD5加密import hashlib #Python3里的引用#import md5 #Python2里的引用 1. md5是不可逆的,不能解密2. 所有语言生成的md5串都是一样的 3. 不 ...

  10. Oracle简单的序列应用

    1.序列的简单作用 1.需要自增或自减一个值的时候. 2.为表中的列自动产生值. 3.由用户创建数据库对象,并可由多个用户共享. 4.一般用于主键或唯一列. 2.创建序列的语法及解析 create s ...