C++网络套接字编程TCP和UDP实例
2013-03-17 22:03
417 查看
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang
1. 创建一个简单的SOCKET编程流程如下
面向有连接的套接字编程
服务器:
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 将套接字设定为监听模式,准备接受客户端请求(listen)
4) 等待客户端请求到来,当请求到来后,接受连接请求,返回一个新的对应于此连接的套接字(accept)
5) 用返回的套接字和客户端进行通信(send/recv);
6) 返回,等待另一个客户端请求
7) 关闭套接字
客户端:
1) 创建套接字(socket)
2) 向服务器发出连接请求(connect)
3) 和服务器进行通信(send/recv)
4) 关闭套接字
面向无连接的套接字编程
服务器:(接收端)
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 用返回的套接字和客户端进行通信(recvfrom);
4) 关闭套接字
客户端:(发送端)
1) 创建套接字(socket)
2) 向服务器发送数据(sendto
3) 关闭套接字
例如:面向有连接的套接字编程
首先在工程-à设置àlink 在对象库模板最后面再加上ws2_32.lib
客户端:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第一步,创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0) ;
//定义套接字地址
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //获取服务器IP地址,inet_addr()将IP地址转为点分十进制的格式
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(1234);
//连接服务器
// connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)
{
//MessageBox("连接失败");
//return;
printf("error");
return 0;
}else
{
printf("success");
}
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("客户端接收到的数据:%s",recvBuf);
send(sockClient,"client send ",strlen("client send ")+1,0);
//关闭套接字
closesocket(sockClient);
//清除套接字资源
WSACleanup();
return 0;
}
服务器端:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第二步创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//第三步:绑定套接字
//获取地址结构
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据
//htonl()将主机的无符号长整形数转换成网络字节顺序。
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(6000);
//htons()将主机的无符号短整形数转换成网络字节顺序
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//监听客户端
listen(sockSrv,5);
//定义从客户端接受的地址信息
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR);
while(1)
{
//不断等待客户端的请求的到来,并接受客户端的连接请求
printf("等待客户连接n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s
to wuhan",inet_ntoa(addrClient.sin_addr));
printf("发送数据n");
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
printf("等待接受数据n");
recv(sockConn,recvBuf,100,0);
printf("%sn",recvBuf);
closesocket(sockConn);
}
WSACleanup();
return 0;
}
面向无连接的套接字编程
例子:
客户端:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockSrv;
sockSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockSrv.sin_family = AF_INET ;
sockSrv.sin_port = htons(6000);
sendto(sockClient,"hello",strlen("hello")+1,0,(SOCKADDR*)&sockSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
return 0;
}
服务器:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addSrv.sin_family = AF_INET ;
addSrv.sin_port = htons(6000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%sn",recvBuf);
closesocket(sockSrv);
WSACleanup();
return 0;
}
1. 创建一个简单的SOCKET编程流程如下
面向有连接的套接字编程
服务器:
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 将套接字设定为监听模式,准备接受客户端请求(listen)
4) 等待客户端请求到来,当请求到来后,接受连接请求,返回一个新的对应于此连接的套接字(accept)
5) 用返回的套接字和客户端进行通信(send/recv);
6) 返回,等待另一个客户端请求
7) 关闭套接字
客户端:
1) 创建套接字(socket)
2) 向服务器发出连接请求(connect)
3) 和服务器进行通信(send/recv)
4) 关闭套接字
面向无连接的套接字编程
服务器:(接收端)
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 用返回的套接字和客户端进行通信(recvfrom);
4) 关闭套接字
客户端:(发送端)
1) 创建套接字(socket)
2) 向服务器发送数据(sendto
3) 关闭套接字
例如:面向有连接的套接字编程
首先在工程-à设置àlink 在对象库模板最后面再加上ws2_32.lib
客户端:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第一步,创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0) ;
//定义套接字地址
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //获取服务器IP地址,inet_addr()将IP地址转为点分十进制的格式
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(1234);
//连接服务器
// connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)
{
//MessageBox("连接失败");
//return;
printf("error");
return 0;
}else
{
printf("success");
}
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("客户端接收到的数据:%s",recvBuf);
send(sockClient,"client send ",strlen("client send ")+1,0);
//关闭套接字
closesocket(sockClient);
//清除套接字资源
WSACleanup();
return 0;
}
服务器端:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第二步创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//第三步:绑定套接字
//获取地址结构
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据
//htonl()将主机的无符号长整形数转换成网络字节顺序。
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(6000);
//htons()将主机的无符号短整形数转换成网络字节顺序
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//监听客户端
listen(sockSrv,5);
//定义从客户端接受的地址信息
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR);
while(1)
{
//不断等待客户端的请求的到来,并接受客户端的连接请求
printf("等待客户连接n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s
to wuhan",inet_ntoa(addrClient.sin_addr));
printf("发送数据n");
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
printf("等待接受数据n");
recv(sockConn,recvBuf,100,0);
printf("%sn",recvBuf);
closesocket(sockConn);
}
WSACleanup();
return 0;
}
面向无连接的套接字编程
例子:
客户端:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockSrv;
sockSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockSrv.sin_family = AF_INET ;
sockSrv.sin_port = htons(6000);
sendto(sockClient,"hello",strlen("hello")+1,0,(SOCKADDR*)&sockSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
return 0;
}
服务器:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addSrv.sin_family = AF_INET ;
addSrv.sin_port = htons(6000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%sn",recvBuf);
closesocket(sockSrv);
WSACleanup();
return 0;
}
相关文章推荐
- C++ 网络套接字编程TCP和UDP实例
- JAVA中TCP/UDP编程实例
- 浅谈java的TCP和UDP编程(附实例讲解)
- C#套接字编程实例UDP/TCP通信
- TCP/UDP编程实例
- [python] 专题七.网络编程之套接字Socket、TCP和UDP通信实例
- C++ boost::asio编程-异步TCP详解及实例代码
- Linux C Socket编程原理及tcp, udp简单实例
- TCP/UDP Socket编程 C/C++实现(Windows Platform SDK)
- C++ boost::asio编程-同步TCP详解及实例代码
- 【黑马程序员】黑马入学准备篇:网络编程之 TCP、UDP和Socket综合实例
- IPV6 UDP编程实例 & IPV6 TCP编程实例
- linux socket编程 TCP和UDP实例
- Java网络编程实例---------------------------------TCP和UDP发送数据统计
- linux下C/C++网络编程基本:socket实现tcp和udp的例子
- C# .net2.0 套接字编程实例 UDP TCP通信
- C++ TCP/UDP 网络编程笔记
- TCP/UDP 网络编程实例
- Linux下TCP和UDP编程实例
- C# 2.0 套接字编程实例 UDP TCP通信