socket通讯tcp与udp的区别
2010-06-29 15:31
381 查看
1.TCP服务器端:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET
sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char
sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org
",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char
recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s/n",recvBuf);
closesocket(sockConn);
}
}
2.TCP客户端:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET
sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s/n",recvBuf);
send(sockClient,"This
is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);
WSACleanup();
}
3.UDP服务器端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN
addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char
recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s/n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
4.UDP客户端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN
addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
TCP与UDP的区别
基于连接与无连接
对系统资源的要求(TCP较
多,UDP少)
UDP程序结构较简单
流模式与数据报模式
TCP保证数据正确性,UDP可能丢包
TCP
保证数据顺序,UDP不保证
具体编程时的区别
socket()
的参数不同
UDP Server不需要调用listen和accept
UDP收发数据用
sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
UDP:在
sendto/recvfrom函数中每次均 需指定地址信息
UDP:shutdown函数无效
部分满足以下几点要求时,应该采用UDP 面向数据报方式
网络数据大多为短消息
拥
有大量Client
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高
例子:ICQ、ping
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET
sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char
sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org
",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char
recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s/n",recvBuf);
closesocket(sockConn);
}
}
2.TCP客户端:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET
sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s/n",recvBuf);
send(sockClient,"This
is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);
WSACleanup();
}
3.UDP服务器端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN
addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char
recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s/n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
4.UDP客户端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup
(
wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(
wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN
addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
TCP与UDP的区别
基于连接与无连接
对系统资源的要求(TCP较
多,UDP少)
UDP程序结构较简单
流模式与数据报模式
TCP保证数据正确性,UDP可能丢包
TCP
保证数据顺序,UDP不保证
具体编程时的区别
socket()
的参数不同
UDP Server不需要调用listen和accept
UDP收发数据用
sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
UDP:在
sendto/recvfrom函数中每次均 需指定地址信息
UDP:shutdown函数无效
部分满足以下几点要求时,应该采用UDP 面向数据报方式
网络数据大多为短消息
拥
有大量Client
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高
例子:ICQ、ping
相关文章推荐
- socket通讯,TCP,UDP,HTTP的区别
- socket通讯,TCP,UDP,HTTP的区别
- TCP、UDP、HTTP、SOCKET之间的区别
- C# Socket与TcpListener、TcpClient和UdpClient的区别及联系
- Socket编程(异步通讯)(Tcp,Udp)
- TCP、UDP、HTTP、SOCKET之间的区别
- Socket与TcpListener、TcpClient、UdpClient 的区别及联系
- SOCKET, TCP/UDP, HTTP, FTP 协议的区别
- 常见通信协议区别——tcp、udp、rpc、http、socket
- Socket编程——TCP/UDP区别
- tcp udp http socket 之间的联系和区别
- Socket编程 (异步通讯) (Tcp,Udp)Part2
- socket与http的区别(TCP、UDP)
- 106.网络分层模型及SOCKET/TCP/UDP/HTTP区别和联系
- Socket的TCP、UDP通讯(实现功能:文字发送,窗口震动,大文件传输,语音发送,语音通话、直接发送全屏截图)
- TCP和UDP网络通讯的区别及实现方式
- 【socket】TCP 和 UDP 在socket编程中的区别
- Socket、Http、TCP/IP、UDP的联系与区别
- Socket网络通信理论基础搜集(TCP/IP协议栈与数据包封装+TCP与UDP的区别)
- TCP和UDP网络通讯的区别及实现方式