socket详解

socket网络编程
1.进程间如何通信
本地进程间通信我们知道有以下几种方式:
1)消息传递(管道,FIFO,消息队列)
管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用。
2)共享内存
不同进程访问同一个逻辑内存
3)同步
互斥量,条件变量,读写锁,信号量
4)远程过程调用
但是网络间的进程是如何通信的呢?如浏览器进程如何与web服务器通信,QQ聊天时,QQ进程如何与服务器或你好友所在的QQ进程通信?
答案是socket,网络间的进程通信几乎都是用的socket.

2.如何识别网络中唯一进程
本地进程间可以通过PID来唯一标识一个进程
网络中我们根据TCP/IP协议族来标识唯一进程,网络层的“IP地址”可唯一标识网络中的主机,而传输层的“协议+端口”可唯一标识主机中的进程。“IP地址+协议+端口”就可以确定唯一进程了。
3.进程间如何通过socket进行通讯
Linux的哲学是一切皆文件,socket也是一种文件。可以使用“打开-读写-关闭”来操作。socket是应用层和运输层之间的一个抽象层。
socket通信流程:
1)服务端创建socket
socket()
2)服务端绑定端口号
bind()
3)服务端监听端口号
listen()
4)客户端创建socket
socket()
5)客户端主动打开socket,连接服务器端socket
connect()
6)服务端接收客户端请求,socket被动打开
同步:accept() 异步:beginaccept()
7)客户端socket向服务端socket写信息
send()
8)服务端socket读取信息
9)客户端socket关闭
10)服务端socket关闭

4.socket建立连接的三次握手

第一步,客户端调用connect,向服务器发送SYN J包,connect阻塞
第二步,服务端收到SYN J包,调用accept函数接收请求,向客户端发送 SYN K,ACK J+1
        accept函数阻塞
第三步,客户端收到服务器的SYN K,ACK J+1后,connect返回,进行SYN K确认,服务端收到ACK K+1时,accept返回,三次握手完成,连接建立。

5.socket释放连接的四次握手


第一步,客户端关闭连接,发送一个FIN M到服务端
第二步,服务端接收到FIN M后,执行被动关闭,对这个FIN M进行确认ACK M+1。
第三步,当服务端发送完毕后,再发送FIN N到客户端
第四步,客户端接收到FIN N调用close关闭它的socket,发送一个ACK N+1到服务端
服务端接收到这个ACK N+1关闭它的socket

6.为什么建立连接是三次握手,释放连接需要四次
这是因为进行释放连接的第二步时,有可能服务端仍有数据发送给客户端,因此,需要分开,先对客户端FIN报文应答,当服务端数据发送完毕后,再发送FIN报文到客户端。

7.socket连接示例
服务器端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr;
    char    buff[4096];
    int     n;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6666);

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    if( listen(listenfd, 10) == -1){
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("======waiting for client‘s request======\n");
    while(1){
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
        continue;
    }
    n = recv(connfd, buff, MAXLINE, 0);
    buff[n] = ‘\0‘;
    printf("recv msg from client: %s\n", buff);
    close(connfd);
    }

    close(listenfd);
}

客户端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    sockfd, n;
    char    recvline[4096], sendline[4096];
    struct sockaddr_in    servaddr;

    if( argc != 2){
    printf("usage: ./client <ipaddress>\n");
    exit(0);
    }

    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
    exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    printf("inet_pton error for %s\n",argv[1]);
    exit(0);
    }

    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
    }

    close(sockfd);
    exit(0);
}
时间: 2024-10-09 21:15:46

socket详解的相关文章

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

网络之Socket详解

网络之Socket详解 1.什么是Socket? Socket本质上还是文件,因为Linux上一切皆文件.Socket也有对应的文件描述符(fd).文件描述符相关的参考另外一篇博客. http://blog.csdn.net/weililansehudiefei/article/details/78113082 在这里简单就认为,它是对应着一个文件的,就可以. Socket位于TCP/IP之上,通过Socket可以方便的进行通信连接.对外屏蔽了复杂的TCP/IP. 2.Socket连接详解 So

计算机基础-Socket详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

Socket详解-Linux Socket编程(不限Linux)

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?

java Socket(详解)转载

在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据. 这篇文章首先介绍Socket类的各个构造方法, 以及成员方法的用法, 接着介绍 Socket的一些选项的作用, 这些选项可控制客户建立与服务器的连接, 以及接收和发送数据的行为. 一. 构造Socket Socket的构造方法有以下几种重载形式:

java网络编程学习笔记(二):socket详解

1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会一直等待下去,直到连接成功或者是出现异常.Socket的构造方法请求连接的时候,受到底层网络传输速度的影响,可能长时间处于等待状态.如果希望限定等待时间,就需要一个无参的构造方法,可以如下做: Socket socket=new Socket(); SocketAdress remoteAddr=n

Python socket 详解

socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的资源.如果协议protocol未指定(等于0),则使用缺省的连接方式. 对于使用一给定地址族的某一特定套接口,只支持一种协议.但地址族可设为AF_UNSPEC(未指定),这样的话协议参数就要指定了.协议号特定于进行通讯的“通讯域”. 创建一个套接口(). #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protoco

Java网络编程二:Socket详解

Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接请求. 客户端:客户端程序根据你服务器所在的主机名和端口号发出连接请求. 两者之间的通信是通过Socket完成的,我们可以认为Socket是两个城市之间的交通工具,有了它,就可以在两个城市之间穿梭了. Socket通信示例 主机A的应用程序和主机B的应用程序通信,必须通过Socket建立连接,而建立

网络编程中的Socket详解---Socket重要参数详解

Java Socket的api可能很多人会用,但是Java Socket的参数可能很多人都不知道用来干嘛的,甚至都不知道有这些参数. backlog 用于ServerSocket,配置ServerSocket的最大客户端等待队列.等待队列的意思,先看下面代码 public class Main { public static void main(String[] args) throws Exception { int port = 8999; int backlog = 2; ServerSo