使用流式字套接字来发送和接收数据代码
使用DatagramSocket发送、接收数据(Socket之UDP套接字)

使用DatagramSocket发送、接收数据(Socket之UDP套接字)用DatagramSocket发送、接收数据(1)Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO 流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
先看一下DatagramSocket的构造器。
DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口。
DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。
DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。
通过上面三个构造器中的任意一个构造器即可创建一个DatagramSocket实例,通常在创建服务器时,创建指定端口的DatagramSocket实例--这样保证其他客户端可以将数据发送到该服务器。
一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据。
receive(DatagramPacket p):从该DatagramSocket中接收数据报。
send(DatagramPacket p):以该DatagramSocket对象向外发送数据报。
从上面两个方法可以看出,使用DatagramSocket发送数据报时,DatagramSocket并不知道将该数据报发送到哪里,而是由DatagramPacket自身决定数据报的目的地。
就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱发送出去,而集装箱本身包含了该集装箱的目的地。
利用流式套接字实现文件的传输

利用流式套接字实现文件的传输buff=(char *)malloc(nFileLen);iResult=fread(buff,1,nFileLen,f);if(iResult!=nFileLen){printf("读入文件错误!\");return 0;}memset(sendline,0,MAXLINE);memset(recvline,0,MAXLINE);while(i!=nFileLen){recvline[i]=*buff;i++;buff++;}//文件名传输结束sprintf(sendline,"%s#%d%s",file,nFileLen,recvline);iResult=send(s,sendline,sizeof(sendline),0);if(iResult==SOCKET_ERROR){printf("send函数调用错误,错误号:%d",WSAGetLastError()); return -1;}fclose(fp);printf("文件发送完成!\");return iResult;}服务器:int tcp_server_fun_echo(SOCKET s){FILE *fp;int i=0;char flong[4];int iResult = 0;uint32_t nFileLen=1;char recvline[MAXLINE];char file[10];memset(file,0,sizeof(file));memset(recvline,0,sizeof(recvline));for(;;){iResult=recv(s,&file[i],1,0);if(iResult==SOCKET_ERROR){printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;}if(file[i]=='#')break;elsei++;}file[i]='\\0';fp=fopen(file,"w+");if(fp==NULL)printf("文件打开失败!");//接收文件长度iResult=recv(s,flong,4,0);if(iResult==SOCKET_ERROR){printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;}sscanf(flong,"%d",&nFileLen);iResult=recv(s,recvline,nFileLen,0);if(iResult==SOCKET_ERROR){printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;}fputs(recvline,fp);fclose(fp);printf("文件接收成功!\");return iResult;}头文件(上次的实验报告中已经写过):#ifndef p_h//预处理指令,防止重复包含头文件#include#include#include#include#include#pragma coment(lib,"ws2_32.lib")using namespace std;class CSocketFrame{public:int start_up();int clean_up();int set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol);int quit(SOCKET s);SOCKET tcp_server(ULONG uIP,USHORT uPort);SOCKET tcp_server(char *hname,char *sname);SOCKET tcp_client(char *hname,char *sname);SOCKET tcp_client(ULONG uIP,USHORT uPort);};int CSocketFrame::start_up(void){WORD wVersionRequested;WSADATA wsaData;int iResult;wVersionRequested=MAKEWORD(2,2);iResult=WSAStartup(wVersionRequested,&wsaData);if(iResult!=0){printf("WSAStartup 调用错误,错误号:%d\",WSAGetLastError());return -1;}/*if(LOBYTE(wsaData.wVersion!=2||HIBYTE(wsaData.wVersion)! =2)){printf("无法找到可用的WSD版本\");WSACleanup();return -1;//告诉用户无法找到可用的WSD}else{printf("WS2.2初始化成功!\");} */return 0;}int CSocketFrame::clean_up(void){int iResult;iResult=WSACleanup();if(iResult==SOCKET_ERROR){//WSACleanup()调用失败printf("WSACleanup 调用错误,错误号:%d\",WSAGetLastError());return -1;}elseprintf("Winsocket dll释放成功!\") ;return 0;}int CSocketFrame::set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol) {struct servent *sp;struct hostent *hp;char *endptr;unsigned short port;unsigned long ulAddr=INADDR_NONE;//将地址结构socketsddr_in初始化为0,并将地址族设为AF_INETmemset(sap,0,sizeof(*sap));sap->sin_family=AF_INET;if(hname!=NULL){//如果hname不为空,转化地址格式ulAddr=inet_addr(hname);if(ulAddr==INADDR_NONE||ulAddr==INADDR_ANY){//调用错误,调用gethostbyname获得主机地址hp=gethostbyname(hname);if(hp==NULL){printf("未知的主机名,错误号:%d\",WSAGetLastError());return -1;}sap->sin_addr=*(struct in_addr *)hp->h_addr;}elsesap->sin_addr.S_un.S_addr=ulAddr;}else//如果调用者没有指明一个主机名或地址,则设为通配地址sap->sin_addr.s_addr=htonl(INADDR_ANY);//尝试转换sname为一个整数port=(unsigned short)strtol(sname,&endptr,0);if(*endptr=='\\0'){//如果成功转化为网络字节序sap->sin_port=htons(port);}else{//如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号sp=getservbyname(sname,protocol);if(sp==NULL){printf("未知服务,错误号:%d\",WSAGetLastError());return -1;}sap->sin_port=sp->s_port;}return 0;}int CSocketFrame::quit(SOCKET s){int iResult=0;iResult=closesocket(s);if(iResult==SOCKET_ERROR){printf("closesocket 调用错误,错误号:%d\",WSAGetLastError());return -1;}iResult=clean_up();return iResult;}SOCKET CSocketFrame::tcp_server(char *hname,char *sname) {SOCKET ListenSocket;int iResult=0;sockaddr_in local;const int on=1;//为服务器的本机地址设置用户输入的地址以及端口号if(set_address(hname,sname,&local,(char*)"tcp")!=0)return -1;//创建套接字ListenSocket=socket(AF_INET,SOCK_STREAM,0);if(ListenSocket==INVALID_SOCKET){printf("socket函数调用错误,错误号:%d\",WSAGetLastError());WSACleanup();return -1;}//绑定服务器地址iResult=bind(ListenSocket,(struct sockaddr *) & local,sizeof(local));if(iResult==-1){printf("bind函数调用错误!错误号:%d\",WSAGetLastError());closesocket(ListenSocket);WSACleanup();return -1;}//设置函数为监听状态,监听队列长度为NLISTENiResult=listen(ListenSocket,SOMAXCONN);if(iResult==SOCKET_ERROR){printf("Listen函数调用错误!错误号:%d\",WSAGetLastError());quit(ListenSocket);return -1;}return ListenSocket;}SOCKET CSocketFrame::tcp_server(ULONG uIP,USHORT uPort){SOCKET ListenSocket=INVALID_SOCKET;int iResult=0;sockaddr_in local;const int on=1;//为服务器的本机地址设置用户输入的地址以及端口号memset(&local,0,sizeof(local));local.sin_family=AF_INET;local.sin_addr.S_un.S_addr=htonl(uIP);local.sin_port=htons(uPort);ListenSocket=socket(AF_INET,SOCK_STREAM,0);if(ListenSocket==INVALID_SOCKET){printf("socket函数调用错误,错误号:%d\",WSAGetLastError());clean_up();return -1;}//绑定服务器地址iResult=bind(ListenSocket,(struct sockaddr *) & local,sizeof(local));if(iResult==SOCKET_ERROR){printf("bind函数调用错误!错误号:%d\",WSAGetLastError());quit(ListenSocket);return -1;}//设置函数为监听状态,监听队列长度为NLISTENiResult=listen(ListenSocket,SOMAXCONN);if(iResult==SOCKET_ERROR){printf("Listen函数调用错误!错误号:%d\",WSAGetLastError());quit(ListenSocket);return -1;}return ListenSocket;}SOCKET CSocketFrame::tcp_client(char *hname,char *sname) {int iResult=0;struct sockaddr_in peer;SOCKET ClientSocket;//为服务器的地址peer设置用户输入的地址以及端口号if(set_address(hname,sname,&peer,(char *)"tcp")!=0)return -1;//创建套接字ClientSocket=socket(AF_INET,SOCK_STREAM,0);if(ClientSocket==INVALID_SOCKET){printf("socket函数调用错误,错误号:%d\",WSAGetLastError());clean_up();return -1;}//请求建立连接iResult=connect(ClientSocket,(struct sockaddr *) & peer,sizeof(peer));if(iResult==SOCKET_ERROR){printf("connect函数调用错误!错误号:%d\",WSAGetLastError());quit(ClientSocket);return -1;}return ClientSocket;}SOCKET CSocketFrame::tcp_client(ULONG uIP,USHORT uPort) {int iResult=0;struct sockaddr_in peer;。
socket函数的三个参数

socket函数的三个参数标题:socket函数的使用方法导语:在计算机网络中,socket函数是一种用于实现网络通信的编程接口。
它是网络应用程序与网络之间的通信端点,通过socket函数可以实现进程间的通信和数据传输。
本文将详细介绍socket函数的三个参数的使用方法,帮助读者理解并能够灵活应用socket函数。
一、参数一:domain(套接字的协议域)在socket函数中,参数domain指定了套接字的协议域。
协议域是一组协议的集合,它定义了套接字可以用于通信的协议类型。
常用的协议域包括AF_INET(IPv4协议)、AF_INET6(IPv6协议)、AF_UNIX(本地通信协议)等。
1. AF_INET(IPv4协议)在使用IPv4协议进行通信时,可以使用AF_INET作为套接字的协议域。
IPv4协议是当前广泛应用的网络协议,它使用32位地址来标识网络中的主机。
2. AF_INET6(IPv6协议)当需要使用IPv6协议进行通信时,可以选择AF_INET6作为套接字的协议域。
IPv6协议是IPv4协议的升级版,它使用128位地址来标识网络中的主机,解决了IPv4地址不足的问题。
3. AF_UNIX(本地通信协议)如果需要在同一台主机上的进程之间进行通信,可以选择AF_UNIX 作为套接字的协议域。
AF_UNIX提供了一种本地通信的方式,不需要通过网络传输数据。
二、参数二:type(套接字的类型)在socket函数中,参数type指定了套接字的类型。
套接字的类型决定了套接字的工作方式和特性。
常用的套接字类型包括SOCK_STREAM(流式套接字)和SOCK_DGRAM(数据报套接字)。
1. SOCK_STREAM(流式套接字)当需要建立可靠的、面向连接的通信时,可以选择SOCK_STREAM作为套接字的类型。
流式套接字提供了一种面向连接的、可靠的通信方式,数据按照顺序传输,不会丢失和重复。
2. SOCK_DGRAM(数据报套接字)如果需要进行无连接的、不可靠的通信,可以选择SOCK_DGRAM作为套接字的类型。
c语言socket函数

c语言socket函数Socket函数是在网络编程中非常重要的一部分,它提供了一种能够在网络上进行通信的机制。
在C语言中,Socket函数库提供了一组函数,用于创建、绑定、连接、接受和发送套接字等操作。
1.创建套接字:- socket(函数用于创建一个套接字,它接收三个参数:协议族(如AF_INET表示IPv4协议族)、套接字类型(如SOCK_STREAM表示面向连接的流式套接字)和协议(通常为0)。
- 示例:int sockfd = socket(AF_INET, SOCK_STREAM, 0);2.绑定套接字:- bind(函数用于将创建的套接字与指定的地址和端口绑定,以便在网络上监听和接收数据。
- 示例:struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));3.监听套接字:- listen(函数用于将套接字设置为监听模式,用于接收来自网络的连接请求。
- 示例:listen(sockfd, 5);4.接受连接:- accept(函数用于接受客户端的连接请求,并返回一个新的套接字用于与客户端进行通信。
- 示例:int newsockfd = accept(sockfd, (struct sockaddr *)&addr, sizeof(addr));5.连接服务器:- connect(函数用于向服务器发送连接请求,并与服务器建立通信。
- 示例:struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr));6.发送和接收数据:- send(函数用于发送数据到已连接的套接字。
linux socket编程基础(必读)

(2) void bcopy(const void * src,void * dest,int n):从参数 src 指定 的内存区域拷贝指定数目的字节内容到参数 dest 指定的内存区域。
在调用函数 connect 之前,客户机需要指定服务器进程的套接字地址。客户 机一般不需要指定自己的套接字地址(IP 地址和端口号),系统会自动从1024 至5000的端口号范围内为它选择一个未用的端口号,然后以这个端口号和本机 的 IP 地址填充这个套接字地址。
客户机调用函数 connect 来主动建立连接。这个函数将启动 TCP 协议的3次 握手过程。在建立连接之后或发生错误时函数返回。连接过程可能出现的错误情 况有:
(2) 如果远程 TCP 协议返回一个 RST 数据段,函数立即以错误返回,错 误类型为 ECONNREFUSED。当远程机器在 SYN 数据段指定的目的端口号处
没有服务进程在等待连接时,远程机器的 TCP 协议将发送一个 RST 数据段,向 客户机报告这个错误。客户机的 TCP 协议在接收到 RST 数据段后不再继续发送 SYN 数据段,函数立即以错误返回。
(3) int bcmp(const void * s1,const void * s2,int n):比较参数 s1指 定的内存区域和参数 s2指定的内存区域的前 n 个字节内容,如果相同则返回0, 否则返回非0。
注:以上函数的原型定义在 strings.h 中。 以 mem 开头的函数有: (1) void * memset(void * s,int c,size_t n):将参数 s 指定的内存区 域的前 n 个字节设置为参数 c 的内容。 (2) void * memcpy(void * dest,const void * src,size_t n):功能同 bcopy (),区别:函数 bcopy()能处理参数 src 和参数 dest 所指定的区域有重叠的 情况,memcpy()则不能。 (4) int memcmp(const void * s1,const void * s2,size_t n):比较参 数 s1和参数 s2指定区域的前 n 个字节内容,如果相同则返回0,否则返回非0。 注:以上函数的原型定义在 string.h 中。 9、 基本套接字函数 (1) socket() #include<sys/types.h> #include<sys/socket.h>
网络编程CAsyncSocket类

• Connect()成员函数的两种格式:
BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ); – lpszHostAddress指定服务器地址的字符串,可以使用域名 ()或IP地址(128.56.22.8); – lpSockAddrLen给出lpSockAddr结构变量中地址的长度, 以字节为单位。 BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );
二、CAsyncSocket类接受处理的消息事件(3)
(4) FD_CONNECT事件通知:通知请求连接的套接字,连接
的要求已被处理。
• 当客户端的连接请求已经被处理时产生该事件。 • 该事件仅对流式套接口有效,发生在客户端。 • 有两种情况: – 服务器已经接收了连接请求,双方的连接已经建立,通 知客户端套接口,可以用来传输数据了; – 连接情况被拒绝,通知客户套接口,它所请求的连接失 败。
– (2)CSocket类更容易使用。CSocket管理了通信的许多方面,如 字节顺序问题和字符串转换问题。这些在使用原始API或 CAsyncSocket类时,都必须用户自己做。 – (3)CSocket类为Windows消息的后台处理提供了阻塞的工作模 式,这是CArchive同步操作所必须的。
MFC的两种编程模式- CSocket类
• CSocket类从CAsyncSocket类派生,是对Windows Sockets API的高级封装。 • CSocket类继承了CAsyncSocket类的许多成员函数,用法 一致。 • CSocket类的高级表现在三个方面:
– (1)CSocket结合archive类来使用套接字。
packetsender发送tcp用法

packetsender发送tcp用法摘要:1.介绍TCP 协议和packetsender 库2.阐述使用packetsender 发送TCP 数据的方法3.实例演示如何使用packetsender 发送TCP 数据4.总结正文:TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
在网络编程中,我们常常需要使用TCP 协议来发送和接收数据。
在Python 中,可以使用packetsender 库来方便地实现TCP 数据的发送。
packetsender 是一个Python 库,它提供了低层次的网络编程接口,可以方便地实现TCP/UDP 数据的发送和接收。
使用packetsender 发送TCP 数据的方法如下:首先,需要导入packetsender 库,并创建一个TCP 套接字。
然后,通过套接字对象的send() 方法发送数据。
最后,通过套接字对象的close() 方法关闭套接字。
下面是一个使用packetsender 发送TCP 数据的实例:```pythonimport packetsender# 创建一个TCP 套接字tcp_socket = packetsender.TCPSocket("127.0.0.1", 12345)# 发送数据tcp_socket.send("Hello, TCP!")# 关闭套接字tcp_socket.close()```在这个实例中,我们首先导入了packetsender 库,然后创建了一个TCP 套接字,该套接字连接到本地地址127.0.0.1 和端口12345。
接下来,我们通过send() 方法发送了一个字符串"Hello, TCP!"。
最后,我们通过close() 方法关闭了套接字。
通过以上步骤,我们就可以使用packetsender 库方便地发送TCP 数据了。
实验1基于流式套接字的网络程序设计(计算机网络Ⅱ)

实验1基于流式套接字的⽹络程序设计(计算机⽹络Ⅱ)实验1 基于流式套接字的⽹络程序设计⼀、实验环境操作系统:Win10开发⼯具:VS2017使⽤语⾔:C⼆、实验内容1.设计思路(1)流式套接字编程模型①通信过程服务器通信过程如下:1.socket初始化;2.创建套接字,指定使⽤TCP进⾏通信;3.指定本地地址和通信端⼝;4.等待客户端的连接请求;5.进⾏数据传输;6.关闭套接字;7.结束对Windows socket dll的使⽤。
客户端通信过程如下:1.socket初始化;2.创建套接字,指定使⽤TCP进⾏通信;3.指定服务器地址和通信端⼝;4.向服务器发送连接请求;5.进⾏数据传输;6.关闭套接字;7.结束对Windows socket dll的使⽤。
②客户-服务器交互模型在通常情况下,⾸先服务器处于监听状态,它随时等待客户连接请求的到来,⽽客户的连接请求则由客户根据需要随时发出;连接建⽴后,双⽅在连接通道上进⾏数据交互;在会话结束后,双⽅关闭连接。
由于服务器端的服务对象通常不限于单个,因此在服务器的函数设置上考虑了多个客户同时连接服务器的情形,基于流式套接字的客户-服务器交互模型如图1-1所⽰。
图1-1 基于流式套接字的客户-服务器交互模型服务器进程要先于客户进程启动,每个步骤中调⽤的套接字函数如下:1.调⽤WSAStartup()函数加载Windows Sockets DLL,然后调⽤socket()函数创建流式套接字,返回套接字s;2.调⽤bind()函数将套接字s绑定到⼀个本地的端点地址上;3.调⽤listen()将套接字s设置为监听模式,准备好接受来⾃各个客户的连接请求;4.调⽤accept()函数等待接受客户的连接请求;5.如果接受到客户的连接请求,则accept()函数返回,得到新的套接字ns;6.调⽤recv()函数在套接字ns上接收来⾃客户的数据;7.处理客户的服务器请求;8.调⽤send()函数在套接字ns上向客户发送数据;9.与客户结束通信后,由客户进程断开连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用流式字套接字来发送和接收数据代码
2009-12-30 15:11
服务器端:
#pragma comment(lib,"ws2_32.lib")
#include<winsock.h>
#include<iostream>
using namespace std;
int init();
int main()
{
init();
SOCKET s,s2;
s=socket(AF_INET,SOCK_STREAM,0);
if (s==0)
{
cout<<"socket error:"<<WSAGetLastError()<<endl;
return -1;
}
sockaddr_in addr,addrfrom;
addr.sin_family=AF_INET;
addr.sin_port=htons(2345);
addr.sin_addr.S_un.S_addr=htons(0);
if (bind(s,(LPSOCKADDR) &addr,sizeof(addr))==SOCKET_ERROR)
{
cout<<"bind error:"<<WSAGetLastError()<<endl;
return -1;
}
if(listen(s,2)==SOCKET_ERROR)
{
cout<<"listen error:"<<WSAGetLastError()<<endl;
return -1;
}
cout<<"waiting for connecting..."<<endl;
int len=sizeof(addrfrom);
if ((s2=accept(s,(LPSOCKADDR) &addrfrom,&len))==INVALID_SOCKET)
{
cout<<"accept error:"<<WSAGetLastError()<<endl;
return -1;
}
cout<<"already connected"<<endl<<"waiting for receiving data..."<<endl; char data[256];
if(recv(s2,data,sizeof(data),0)==SOCKET_ERROR) {
cout<<"recv error"<<WSAGetLastError()<<endl;
return -1;
}
cout<<"received data is:"<<data<<endl;
}
int init()//成功则返回0
{
WSADATA wsadata;
int nRc=WSAStartup(0x0101,&wsadata);
if (nRc) return -1;
if (wsadata.wVersion!=0x0101)
{
WSACleanup();
return -1;
}
return 0;
}
客户端:
#pragma comment(lib,"ws2_32.lib")
#define IP "127.0.0.1"//这里设置服务器ip地址。
#include<winsock.h>
#include<iostream>
#include<conio.h>
using namespace std;
int init();
int main()
{
init();
SOCKET s;
s=socket(AF_INET,SOCK_STREAM,0);
if (s==0)
{
cout<<"socket error:"<<WSAGetLastError()<<endl; return -1;
}
sockaddr_in addr,addrto;
addrto.sin_addr.S_un.S_addr=inet_addr(IP);
addrto.sin_family=AF_INET;
addrto.sin_port=htons(2345);
addr.sin_family=AF_INET;
addr.sin_port=htons(2346);
addr.sin_addr.S_un.S_addr=htons(0);
if (bind(s,(LPSOCKADDR) &addr,sizeof(addr))==SOCKET_ERROR)
{
cout<<"bind error:"<<WSAGetLastError()<<endl;
return -1;
}
cout<<"press any key to connecting"<<endl;
_getch();
if (connect(s,(LPSOCKADDR)&addrto,sizeof(addrto))==SOCKET_ERROR) {
cout<<"connect error:"<<WSAGetLastError()<<endl;
return -1;
}
char data[256];
cout<<"input message you want to send:"<<endl;
gets(data);
if(send(s,data,sizeof(data),0)==SOCKET_ERROR)
{
cout<<"send error:"<<WSAGetLastError()<<endl;
return -1;
}
cout<<"message sended"<<endl;
}
int init()//成功则返回0
{
WSADATA wsadata;
int nRc=WSAStartup(0x0101,&wsadata);
if (nRc) return -1;
if (wsadata.wVersion!=0x0101)
{
WSACleanup();
return -1;
}
return 0;
}。