基于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();

}

时间: 2024-10-12 03:57:59

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

基于TCP/UDP的socket编程

基于TCP(面向连接)的socket编程服务器端顺序: 1. 创建套接字(socket) 2. 将套接字绑定到一个本地地址和端口上(bind) 3. 将套接字设为监听模式,准备接收客户请求(listen) 4. 等待客户请求的到来:当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept) 5. 用返回的套接字和客户端进行通信(send/recv) 6. 返回,等待另一个客户请求 7. 关闭套接字(closesocket)客户端程序: 1. 创建套接字(socket) 2.

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

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Java网络编程基础(二)-- 基于TCP/IP的Socket编程

本节讲点: 客户端套接字:Socket:Socket的创建和使用方法,以及Socket选项和异常. 服务端套接字:ServerSocket:SeverSocket的创建和使用方法,以及ServerSocket选项 简单的Client/Server对话程序 支持多客户端的Client/Server服务响应程序 在学习JDK的网络编程之前先要了解一下网络基础知识和网络协议. TCP(传输控制协议)一种基于连接的通信协议.可靠传输 UDP(用户数据包协议)不稳定连接的通信协议 TCP和UDP的端口如下

基于TCP协议之——socket编程

一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个"插座",然后通过连接上"插座"的两头也就是由这两个socket组成的socket pair就标识唯一一个连接,以此来表示网

基于TCP协议的socket编程

一.什么是socket socket本身有"插座"的意思,在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的个进程,"IP地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socketpair就唯一标识一个连接. 套接字是一种进程间的通信的方法,不同于以往介绍的进程间通信方法的是,它并不局限于同一台计算机的资源,例如文件系统空间,共享内存或者

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

1.1 功能结构图   网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务端和服务器中转客户端一起使用. 功能结构体如下图所示:  1.2 编写程序 网络通信程序分为2个模块实现,点对点模块和服务器中转模块. common.h #ifndef __COMMON_H__ #define __COMMON_H__ #include "stdafx.h" #inclu

基于UDP协议之——socket编程

一. socket API 前面一篇<基于TCP协议之--socket编程>http://2627lounuo.blog.51cto.com/10696599/1775559已经花了大量的篇幅讲述了socket和使用基本的socket API所需要注意的问题,这里就不再赘述了.下面主要谈论的是UDP和TCP在socket编程中的不同之处: 1. 创建sock 和TCP面向连接的可靠的字节流传输服务不同的是,UDP是无连接的不可靠的数据报传输服务:虽然有所不同,但同样在进程间通信的时候需要提供出

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

基于TCP协议的socket套接字编程

基于TCP协议的socket套接字编程 一.什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. [ 注意:也有