篇一 :socket和端口理解

socket和端口理解.txt爱一个人很难,恨一个人更难,又爱又恨的人最难。爱情永远不可能是天平,想在爱情里幸福就要舍得伤心!有些烦恼是我们凭空虚构的,而我们却把它当成真实去承受。socket和端口理解2009-05-19 00:03//

一个socket句柄代表两个地址对 “本地ip:port”--“远程ip:port”

在windows下叫句柄,在linux下叫文件描述符

socket为内核对象,由操作系统内核来维护其缓冲区,引用计数,并且可以在多个进程中使用。

至于称它为“句柄”“文件描述符”都是一样的

///aezealer/blog/item/3b1582f4909da9e77609d795.html转载于

首先,随着时间的推移,我会不断地向这篇里面加东西,知道我认为应该结束了为止。 这篇文档实际上是我的学习小结的一部分,所以如果有人能够来信指出其中的错误或不 足,那我可是感激淋涕了。

我假定读者已经对于socket连接的建立过程和各种状态转换比较熟悉了,因为这篇文档的 目的是澄清概念,而不是介绍概念。

在使用socket编程时,我们都知道在网络通信以前首先要建立连接,而连接的建立是通过 对socket的一些操作来完成的。那么,建立连接的过程大致可以分为以下几步:

1. 建立socket套接字。

2. 给套接字赋予地址,这个地址不是通常的网络地址的概念。

3. 建立socket连接。

1. 建立socket套接字。

使用socket建立套接字的时候,我们实际上是建立了一个数据结构。这个数据结构最主要 的信息是指定了连接的种类和使用的协议,此外还有一些关于连接队列操作的结构字段 (这里就先不涉及他们了)。

当我们使用socket函数以后,如果成功的话会返回一个int型的描述符,它指向前面那个 被维护在内核里的socket数据结构。我们的任何操作都是通过这个描述符而作用到那个数 据结构上的。这就像是我们在建立一个文件后得到一个文件描述符一样,对文件的操作都 是通过文件描述符来进行的,而不是直接作用到inode数据结构上。我之所以用文件描述 符举例,是因为socket数据结构也是和inode数据结构密切相关,它不是独立存在于内核 中的,而是位于一个VFS inode结构中。所以,有一些比较抽象的特性,我们可以用文件 操作来不恰当的进行类比以加深理解。

…… …… 余下全文

篇二 :Socket端口

Socket端口

20xx年07月09日 星期一 14:54

转载自:/thread-13-1-1.html

要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。

对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。

我们还知道如下几个事实:

1。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。

2。很多防火墙只允许特定目标端口的数据包通过。

3。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。

于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了--防火墙一定会组织其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西?

…… …… 余下全文

篇三 :如何查看Windows操作系统Socket端口占用情况

如何查看Windows操作系统Socket端口占用情况

以查看Radius端口占用情况为例:

1、在cmd中 输入 C:\>netstat -aop udp

2、由上图可见Radius (1812) 和 Radacct(1913)端口被进程ID是 9548的进程占用。

然后再任务管理器中查看9548进程是哪个执行程序,如下图所示:

…… …… 余下全文

篇四 :socket通讯端口并发量受限制解决方案

方案一

MaxUserPort和TcpTimedWaitDelay解除卸载异常 (2009-08-04 19:37:31)

对于 Windows 平台,其默认设置通常已经够用。但是,在极重负载下,可能需要调整 MaxUserPort 和 TcpTimedWaitDelay。这些参数决定应用程序请求的用户端口的可用性。

默认情况下,使用 MaxUserPort 参数,在值 1024 和 5000 之间(包括 1024 和 5000)对短暂(也就是短期的)端口进行分配。TcpTimedWaitDelay 参数控制应用程序关闭 TCP 连接后 OS 回收端口所需要等待的时间,默认值为 4 分钟。在重负载中,可能会超过这些限制,并导致“正在使用的地址:连接”异常。如果遇到“正在使用的地址:连接”异常,请尝试在

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 键下设置 MaxUserPort 和 TcpTimedWaitDelay 注册表值:

MaxUserPort = dword:00004e20(用十进制表示为 20,000)

TcpTimedWaitDelay = dword:0000001e(用十进制表示为 30) 如果异常仍存在,请增加 MaxUserPort 参数的值。

…… …… 余下全文

篇五 :Java语言Socket接口用法详解

Socket接口用法详解

在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求。

扩展:

ServerSocket中常用的构造函数及方法

构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

方法:

Socket accept() 产生阻塞,监听指定的端口,直至有客户端发来连接请求

void close() 关闭当前ServerSocket

InetAddress getInetAddress() 返回ServerSocket监听的,本机的IP地址

int getLocalPort() 返回ServerSocket监听的,本机的IP地址上指定的端口号

int getSoTimeout();void setSoTimeout(int timeout) 设置连接过程中没有得到相应的等待期限时间(TimeOut)

String toString()   以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号

Socket类中常用的构造函数和方法

构造函数:Socket(InetAddress address,int port) 用于创建一个链接,向指定的IP地址上指定的端口的服务器端程序发送连接请求

Socket(String host,int port)   同上,但该方法允许通过主机名字符串向服务器发送连接请求

方法:

void close()关闭当前的Socket 连接

InetAddress getInetAddress() 返回Socket建立了连接的服务器的IP地址

…… …… 余下全文

篇六 :socket 通信过程及流程

socket 通信过程及流程

下图是基于TCP协议的客户端

socket通信过程及流程

/服务器程序的一般流程:

服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。

数据传输的过程:

建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服

务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()

socket通信过程及流程

阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。

如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务器的read()返回0,这样服务器就知道客户端关闭了连接,也调用close()关闭连接。注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。

在学习socket API时要注意应用程序和TCP协议层是如何交互的: *应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段 *应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段,再比如read()返回0就表明收到了FIN段

…… …… 余下全文

篇七 :java中socket套接字定义与使用

总结java socket编程

20xx年05月17日 07:54

一,网络编程中两个主要的问题

一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。

在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。

而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提 出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也 能及时得到服务。

二,两类传输协议:TCP;UDP

TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

比较:

UDP:1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

…… …… 余下全文

篇八 :c语言中socket编程原理

socket编程原理

问题的引入:

UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。

TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。首先,进行网络操作的两个进程在不同机器上,如何建立它们之间的联系?其次,网络协议存在多种,如何建立一种通用机制以支持多种协议?这些都是网络应用编程界面所要解决的问题。

在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面──套接字(socket)在网络软件中被广泛应用,至今已引进微机操作系统DOS和Windows系统中,成为开发网络应用软件的强有力工具,本章将要详细讨论这个问题。

2.2 套接字编程基本概念

在开始使用套接字编程之前,首先必须建立以下概念。

2.2.1 网间进程通信

进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe)、命名管道(named pipe)和软中断信号(signal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5

…… …… 余下全文