套接字

C语言学习笔记-网络与套接字

吃可爱长大的小学妹 提交于 2019-12-03 04:47:13
所有程序都需要编写检查错误的代码 一.基础知识 客户端与服务器之间将展开一段结构化对话,叫协议。 在C语言中,如果写一个与网络通信的程序,就需要新的数据流-套接字,套接字是双向的,既可以输入也可以输出 1.使用socket()函数创建一个套接字数据流 #include <sys/socket.h> int xxxx = socket(PF_INET, SOCK_STREAM, 0); xxxx是套接字名字 套接字与客户端程序通信,服务器需要经历,绑定端口,监听,接受连接,开始通信,四个阶段 服务启动时,服务器会为每项服务分配一个端口,服务器启动时,需要告诉操作系统将要使用哪个端口,这个过程叫做端口绑定。 2.这些代码将创建一个表示"互联网xxx端口"的套接字名 #include <arpa/inet.h> struct sockeaddr_in xxxx; xxxx.sin_family = PF_INET; xxxx.sin+port = (in_port_t)htons(端口号); xxxx.sin_addr.s_addr = htonl(INADDR_ANY); int x = bind (套接字名字, (struct sockaddr * ) &xxxx, sizeof(name)); 3.设置客户端连接服务器的排队数量 listen(套接字名字, xx) xx为人数

网络编程socket套接字及其使用(五)

做~自己de王妃 提交于 2019-12-03 04:21:11
今天我们继续就网络编程进行深入的探讨,我们知道TCP/IP协议是面向连接的socket编程,也就是通信是基于连接,必须先建立连接,我们才可以进行通信。具体流程如下: 服务器端流程: 创建套接字(socket) 将套接字绑定到一个本地地址和端口上(bind) 将套接字设为监听模式,准备接受客户请求(listen) 等待客户请求到来:当请求到来后,接受连接请求,返回一个新的对于此次连接的套接字(accept) 用返回的套接字和客户端进行通信(send/recv) 返回等待另一个客户请求。 关闭套接字。 代码如下: 1 #include<Winsock2.h> 2 #include<stdio.h> 3 4 void main() 5 { 6 //load socket libariy 7 WORD wVersionRequested; 8 //this struct use to stored Windows Sockets value after call WSAStartup() function, 9 //include the data from Winscok.dll 10 WSADATA wsaData; 11 int err; 12 wVersionRequested=MAKEWORD(1,1); 13 err = WSAStartup(wVersionRequested

Socket

匿名 (未验证) 提交于 2019-12-03 00:41:02
socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket 类型 socket.AF_UNIX 只能够用于单一的Unix类型进程间通信 socket.AF_INET 服务器之间网络通信 socket.AF_INET6 IPv6 socket.SOCK_STERAM 流式socket,用于TCP socket.SOCK_DGRAM 数据模式socket,用于UDP socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而socket.SOCK_RAW可以;其次,socket.SOCK_RAW也可以处理特殊的IPv4报文;此外。利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头 socket.SOCK_SEQPACKET 可靠的连续数据包服务 socket 函数 服务端socket函数 s.bind(address) 将套接字绑定到地址,在AF_INET下,以元祖(hsot,port)的形式表示地址 s.listen(backlog) 开始监听TCP传入连接,backlog指定可以挂起的最大连接数 s.accept() 接收TCP连接并返回(conn,address),其中conn是新的套接字对象

WinSock原始套接字编程(Raw Socket)

匿名 (未验证) 提交于 2019-12-03 00:34:01
目录: 1.原始套接字及其功能 2.原始套接字的通信流程 3.收发ICMP数据包 3.1ping 3.2 Trace Route(tracert) 4发送自定义的IP分组 5.捕获IP数据包(网络嗅探Sniffer) 1.收发ICMP包之ping程序: // Ping.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <winsock2.h> #pragma comment(lib, "WS2_32") #define DATALEN 1012 #define PACKAGENUM 10 //发送ICMP会从请求报文的个数 using namespace std; /***定义ICMP包结构***/ typedef struct icmp_hdr { unsigned char icmp_type; // ICMP包类型 unsigned char icmp_code; // 代码 unsigned short icmp_checksum; // 校验和 unsigned short icmp_id; // 惟一确定此请求的标识,通常设置为进程ID unsigned short icmp_sequence; // 序列号 unsigned long icmp_timestamp; //

ZeroMQ简单介绍

匿名 (未验证) 提交于 2019-12-03 00:34:01
ZeroMQ中的字符串是指定长度的,也就是不会向C语言中一样,使用0作为最后的字符串的表示。因此,当接受字符串数据的时候是纯净的字符串数据,需要你自己处理字符串结尾的工作。 ZeroMQ应用程序总是创建一个上下文开始,然后用它来创建套接字。应该在进程中只创建并使用一个上下文。上下文是单个进程中所有套接字的容器,并充当了inproc套接字的传输工具。 在主代码开始执行一个zmq_ctx_new(),在代码最后执行一个zmq_ctx_destory()。如果套接字没有关闭,则zmq_ctx_destory函数将一直挂起,即使关闭了所有的套接字,如果有悬而未决的连接或者发送,zmq_ctx_destory也将等待下去,除非你在关闭这些套接字之前将linger设置为0. 消息对象 套接字 上下文共同组成了ZeroMQ对象。 处理完消息的那一刻,总是用zmq_msg_close()关闭它。 当你退出程序的时候,关闭你的套接字,然后调用zmq_ctx_destory()销毁上下文。 不要在多线程中使用同一个套接字,记住不要这样做。 关闭每个有持续请求的套接字 首先设置一个低的linger值,然后关闭套接字。 最后是销毁上下文,这将导致连接到的线程的阻塞的接受或者是发送都将返回一个错误,捕获该错误,然后在该线程中设置linger,关闭套接字并退出,不要多次销毁同样的上下文,在主线程中的zmq

windows下的IOCP

匿名 (未验证) 提交于 2019-12-03 00:34:01
对应Linux下的epoll,windows下也有实现IO复用的方法,那就是IOCP,又叫重叠IO,其实和异步IO没什么区别,《TCPIP网络编程》这本书也没有对重叠IP和异步IO做明确的区分。 首先,创建重叠IO的套接字。 SOKET WSAocket( int af, int type , int protocol , LPWSAPROTOCOL_INFO lpProtocolInfo , GROUP g , DWORD dwFlags ); 成功时返回套接字句柄,失败时返回INVALID_SOKET。 af 协议族信息 前三个参数和普通套接字一致,后三个分别为 lpProtocolInfo 包含创建的套接字信息的WSAPROTOCOL_INFO结构体变量地址值,不需要时传递NULL。 g 为扩展函数而预约的参数,可以使用0。 dwFlags 套接字属性信息。 执行重叠IO的WSASend函数 int WSASend(SOKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 1

TCP HTTP SOCKET之间的有什么关系

匿名 (未验证) 提交于 2019-12-03 00:33:02
网络由下往上分为   物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。   通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,   三者从本质上来说没有可比性,   socket则是对TCP/IP协议的封装和应用(程序员层面上)。   也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,   而HTTP是应用层协议,主要解决如何包装数据。   关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:   “我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容。   如果想要使传输的数据有意义,则必须使用到应用层协议。   应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。   WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”   而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。   通过Socket,我们才能使用TCP/IP协议。   实际上,Socket跟TCP/IP协议没有必然的联系。   Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

27TCP

匿名 (未验证) 提交于 2019-12-03 00:32:02
TCP通信流程步骤: 服务端: 等待(被动)接收发送 客户端:主动发送接收 TCP通信流程图: 什么是套接字? 注意:IP地址决定往哪个主机发送,端口决定哪个程序接受 优点: 1.像操作文件描述符一样操作套接字 2.双向通信接口,起源于管道 3.比管道功能更强,应用更广泛 4.支持 read , write 等操作用于收发数据 服务端具体函数解析: 创建套接字 #include<sys/socket.h> 参数: 第一参数参考值: socket 创建套接字 --- domain 第二参数参考值: socket 创建套接字 --- type 注意: 套接字 SOCKET 类型 SOCK_STREAM SOCK_DGRAM 数据报套接字:使用 UDP 协议。 提供无连接的,无序的,不保证可靠性的数据通信流。如 tftp, bootp 等 SOCK_RAW 原始流套接字:收发原始数据包,应用于底层协议开发,进行底层操作 只有 root 用户才有权限创建这个 socket 第三参数参考值: socket 创建套接字 --- protocol <netinet/in.h> IPPROTO_RAW: RAW 只能发送包,且需要自己填写IP头,计算校验和 绑定套接字 struct sockaddr { } 对于不同的协议族,协议地址 sa_data[14] 有不同的描述方式 AF_INET

Socket编程步骤(笔试题)

匿名 (未验证) 提交于 2019-12-03 00:32:02
问:socket编程执行send之后系统进行哪种操作? 答:如果采用系统是采用阻塞模式,则系统执行send之后会等待对方返回结果才执行下一步。如果是非阻塞模式则将当前线程挂起,执行系统下一个操作。 问:什么是粘包? 答:出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。 发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据. sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字,UDP为数据报套接字。 服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()); 2

基于TCP/UDP的Socket编程

匿名 (未验证) 提交于 2019-12-03 00:30:01
基于TCP(面向连接)的socket编程,分为客户端和服务器端。 服务器端的流程如下: (1)创建套接字(socket) ---- Create a socket. (2)将套接字绑定到一个本地地址和端口上(bind) ---- Remove any existing file with the same pathname as that to which we want to bind the socket. (3)将套接字设为 监听模式 ,准备接收客户端请求(listen)即等待客户端调用connect(). ---- Construct an address structure for the server's socket, bind the socket to that address, and mark the socket as a listening socket. (4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept) ---- Execute an infinite loop to handle incoming client requests. Each loop iteration (迭代,反复,重复) performs the following steps: -- Accept a connection,