您的位置:首页 > 理论基础 > 计算机网络

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: