当前位置:首页 » 编程软件 » socket编程tcp

socket编程tcp

发布时间: 2023-07-06 18:24:12

① 简述基于TCP和UDP的Socket编程的异同

Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM).
流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。
数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。

② socket编程·send和recv

socket的send和recv是同时支持TCP和UDP的。从这两个函数的设计可以看出,协议简单来说就是读写数据。

socket的选项是 SOCK_STREAM 。
send的返回值>0时,表示实际发送了多少字节。 注意: 只是到系统缓存里,系统决定什么时候会发送这些数据。
send的返回值==0时,这个在send空串时会发生,是正常的。
send的返回值<0时(只会等于-1吧),需要检查errno,败册芹当 errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN 时,连接正常,可以稍后再试。其他的就是连接异常了。

recv的返回值>0时,表示实际接受到多少字节。
recv的返回值==0时, 表示连接断开 ,也就是收到了FIN或者RST。
recv的返回值<0时,检查errno,和send类似。

socket的选项是 SOCK_DGRAM 。
send的返回值>0时,姿搏 返回值应该等于发送的数据长察毕度 。如果send的数据大于MTU,会在IP层分片,到达目标机器后IP层重组。
send的返回值==0时,这个只在发送空串时出现。 注意: 真的会发送空数据的。
send的返回值<0时,检查errno,确定连接是否还正常。一般不会发生吧,UDP的send是直接发送出去的。

recv的返回值>0时, 收到一个完整的数据包 。这个完整性是有IP层保证的。
recv的返回值==0时, 收到空包,这和TCP有很大不同
recv的返回值<0时,检查errno,确定socket是否正常。
PS: UDP还有两个函数 sendto 和 recvfrom 。客户端在调用connect后,才能用 send 和 recv , 服务器端只能用 sendto 和 recvfrom

UDP无连接,无顺序,自然不能代替TCP。
TCP是流式协议,需要应用层确认数据是否接受完整,也不能代替UDP。
应用要同时支持两种协议,得在上层做包装。有个KCP,使用UDP模拟TCP。

③ 如何编写简单的socket网络程序 如何编写基于TCP协议的网络程序

下面是个人用了一个40分钟左右的时间编写的程序,在这编写过程中,非常重要的一点就是: 要理解 tcp协议编写程序的原理,即编写服务器端的过程,以及编写客户端的过程。 只要把握这两点就可以很容易编写出来了,但是要快速编写出这个程序,那么VC6.0开发工具里,最好要安装一个番茄插件,这个插件可以快速提高你的编写程序的效率,还有也要安装msdn 文档,这样在编写过程中,遇到对某个函数的参数想不全的时候,使用msdn就能快速帮你回忆了。 呵呵,如果你那一天去面试一家牛逼的公司的哇,很有可能就是 在笔试完成之后,就要进行机试了,这就完全考查出你的真正编程水平了。 能在极短时间里完成一个socket网络程序,那么就可以令面试官感到非常满意了。 不过,这个程序,还没有连接数据库,以后再继续搞了。
如果你去面试 深圳科技园 那家 伟易达 集团公司的软件工程师的哇,那么机试题目就是这个。 当时我去面试,首先进行笔试,面试官对我笔试成绩比较满意,所以就叫我留下来吃顿饭,下午进行机试。 当时我应聘岗位是linux系统工程师C语言, 可是笔试题目,不但考核C,还考核C++,JavaScript,html。 我感觉好奇怪,心里想,好像我是应聘VC++开发那个岗位了。 于是我等到下午,他拿来机试题目之时,才真正明白,果然是他要安排我从事VC++开发了,题目就是:编写基于TCP/IP协议网络程序,并实现简单的聊天程序,而且要连接数据库。 当时我又失望了。 于是我就提出,我不想做这个题目,因为我是想应聘Linux系统C语言开发的。 就这样失望的走了。
下面是个人完全能运行的代码:
服务器端源码
#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main()
{

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}
SOCKET socketServer=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_port=htons(6000);
bind(socketServer, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
listen(socketServer, 5);
SOCKADDR_IN addrClient;
int addrLen=sizeof(SOCKADDR_IN);
char sendBuf[100];
char recvBuf[100];
int i=1;
while(1)
{
printf("服务器端等待第%d个客户端连接请求...\n", i++);
SOCKET newsocketServer=accept(socketServer,(struct sockaddr *)&addrClient, &addrLen);
if(newsocketServer!=INVALID_SOCKET)
{
printf("服务器端与客户端连接成功...\n");
}
memset(sendBuf,0,100);
sprintf(sendBuf,"Welcome you to come here");
send(newsocketServer, sendBuf, strlen(sendBuf)+1,0);
memset(recvBuf,0,100);
recv(newsocketServer,recvBuf,100,0);
printf("服务器端收到信息:%s\n",recvBuf);
closesocket(newsocketServer);
}
WSACleanup();
return 0;
}
此文章来自于个人博客: 阿浪博客 http://blog.163.com/wenxianliang08@126/
客户端源码:
#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main()
{

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}

SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrServer;

addrServer.sin_family=AF_INET;

addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrServer.sin_port=htons(6000);

char sendBuf[100];

char recvBuf[100];
printf("客户端向服务器端连接请求...\n");
int Isconnect=connect(socketClient, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
if(Isconnect!=0)
{
printf("客户端无法连接服务器端...\n");
return 0;
}
printf("客户端已成功连接服务器端...\n");
memset(recvBuf,0,100);

recv(socketClient,recvBuf,100,0);
printf("客户端收到信息:%s\n",recvBuf);
memset(sendBuf,0,100);

sprintf(sendBuf,"Hello , I am Mr Wen !");

send(socketClient, sendBuf, strlen(sendBuf)+1,0);

closesocket(socketClient);

WSACleanup();

return 0;
}

④ Python 之 Socket编程(TCP/UDP)

socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

有效的端口号: 0~ 65535
但是小于1024的端口号基本上都预留给了操作系统
POSIX兼容系统(如Linux、Mac OS X等),在/etc/services文件中找到这些预留端口与的列表

面向连接的通信提供序列化、可靠的和不重复的数据交付,而没有记录边界。意味着每条消息都可以拆分多个片段,并且每个消息片段都能到达目的地,然后将它们按顺序组合在一起,最后将完整的信息传递给等待的应用程序。
实现方式(TCP):
传输控制协议(TCP), 创建TCP必须使用SOCK_STREAM作为套接字类型
因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的IP,
所以整个系统通常结合这两种协议(TCP/IP)来进行网络间数据通信。

数据报类型的套接字, 即在通信开始之前并不需要建议连接,当然也无法保证它的顺序性、可靠性或重复性
实现方式(UDP)
用户数据包协议(UDP), 创建UDP必须使用SOCK_DGRAM (datagram)作为套接字类型
它也使用因特网来寻找网络中主机,所以是UDP和IP的组合名字UDP/IP

注意点:
1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。

TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

什么时候应该使用TCP : 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输.

UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……

⑤ linux socket编程后是tcp还是udp

Linux socket编程既可以是TCP连接,也可以是UDP连接。Linux socket编程首先要用socket系统调用创建一个套接字,socket系统调用的原型是:
int socket(int domain, int type, int protocol);
当socket函数的type参数指定为SOCK_STREAM时,就相当于建立的是个TCP连接;当type参数指定为SOCK_DGRAM时,建立的就是一个UDP连接。当建立TCP或者UDP连接的时候,注意把第一个参数domain指定为AF_INET。

⑥ TCP 和 UDP 在socket编程中的区别

一、TCP与UDP的缓好毕区别
基于连接与无连接
对系统资源的要求(TCP较多,UDP少)
UDP程序结构较简单
流模式与数据报模式
TCP保证数据正确性,UDP可能丢包
TCP保证数据顺序,UDP不保证
部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息
拥有大量Client
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高
具体编程时的区别 socket()的参数不同
UDP Server不需要调用listen和accept
UDP收发数据用sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
袜握UDP:扰芹在sendto/recvfrom函数中每次均 需指定地址信息
UDP:shutdown函数无效

热点内容
芒果tv缓存的视频在哪个文件里 发布:2025-02-07 16:45:05 浏览:814
php邮件群发 发布:2025-02-07 16:45:05 浏览:612
mysql数据库基本语句 发布:2025-02-07 16:41:48 浏览:250
医院门禁密码多少 发布:2025-02-07 16:41:43 浏览:527
服务器遭美国ip攻击签名 发布:2025-02-07 16:22:48 浏览:546
如何配置二良腌料 发布:2025-02-07 16:11:54 浏览:735
数据库课程设计学生管理系统 发布:2025-02-07 16:11:50 浏览:764
美国文化密码是什么 发布:2025-02-07 16:07:14 浏览:261
安卓手机下雪特效怎么p 发布:2025-02-07 15:49:30 浏览:319
轮胎存储铭牌 发布:2025-02-07 15:43:38 浏览:74