C++新手如何学习socket
发布时间:2025-05-23 00:23:19 发布人:远客网络
一、C++新手如何学习socket
1、先从最简单的Socket文档里了解普通的客户端和服务端工作步骤;
2、再而逐步了解阻塞和非阻塞模式;
3、再继续理解TCP/IP中的可靠连接和非可靠连接;
4、写出简单的客户端服务端工程,然后接着学习更多的协议,察看<<Windows核心编程>>;
5、最后再学习异步I/O操作,完成端口的使用方式,进而写出功能强大的Socket通讯程序。
二、Socket编程
最近也在学还有一个自己写的C++聊天程序有点大下面是C写的
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM).
在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
#include<Winsock2.h>//加裁头文件
#include<stdio.h>//加载标准输入输出头文件
WORD wVersionRequested;//版本号
wVersionRequested= MAKEWORD( 1, 1);//1.1版本的套接字
err= WSAStartup( wVersionRequested,&wsaData);
}//加载套接字库,加裁失败则返回
if( LOBYTE( wsaData.wVersion)!= 1||
HIBYTE( wsaData.wVersion)!= 1){
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字绑定到一个本地地址和端口上(bind)
listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求(listen)。
SOCKADDR_IN addrClient;//定义地址族
int len=sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三个参数一定要有初始值。
//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
sprintf(sendBuf,"Welcome%s to ",
inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客户端进行通信(send/recv)。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
closesocket(sockConn);//关闭套接字。等待另一个用户请求
wVersionRequested= MAKEWORD( 1, 1);
err= WSAStartup( wVersionRequested,&wsaData);加载套接字库
if( LOBYTE( wsaData.wVersion)!= 1||
HIBYTE( wsaData.wVersion)!= 1){
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。
char recvBuf[100];和服务器端进行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);关闭套接字。
WSACleanup();//必须调用这个函数清除参数
三、浅谈Java中如何利用socket进行网络编程(一)
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。在java中,有专门的socket类来处理用户的请求和响应。利用SOCKET类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在JAVA中如何利用socket进行网络编程。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。一、建立服务器类 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server= new ServerSocket(9998)这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket incoming= server.accept()进而得到输入流和输出流,并进行封装BufferedReader in= new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out= new PrintWriter(incoming.getOutputStream(),true);随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。