socket编程常见函数使用方法

socket知识

有了IP地址,socket可知道是与哪一台主机的哪一个进程通信

有了端口号,就知道是这个进程的哪一个套接字进行传输

应用进程使用描述符与它的套接字进行通信,也就是说一个进程创建一个套接字时就会返回一个套接字描述符
在这里插入图片描述

socket的地址信息最重要

已定义了结构sockaddr_in:,使用TCP/IP协议族的网络应用程序声明端点地址变量时,使用结构sockaddr_in

struct sockaddr_in 
{u_char sin_len; 	//地址长度u_char sin_family;	//地址族 TCP/IP的地址是AF_INETu_short sin_port;	//端口号struct in_addr sin_addr;	//IP地址char sin_zero[8];	//未用
}

socket api(WinSock)

windows环境下,先使用WSAStartup初始化Windows Sockets API,然后应用程序执行任务,最后执行WSACleanup释放所使用的Windows Sockets DLL占用的系统资源,接触与socket库的绑定。

WSAStartup

int WSAStartup(WORD wVersionRequested,LPWSADATA IpWSAData);

使用Socket的应用程序在使用Socket之前必须首先调用WSAStartup函数

两个参数:

  • 第一个参数指明程序请求使用WinSock版本,高位字节指明副版本、低位字节指明主版本

    • 0x102表示2.1版本
  • 第二个参数返回实际的WinSock的版本信息

    • 指向WSADATA结构的指针

例:使用2.1版本WinSock的程序代码段

wVersionRequested = MAKEWORD(2,1);
err = WSAStartup(wVersionRequested,&wsaData);

socket

该函数创建套接字

sd = socket(protofamily,type,proto);
  • 创建套接字

  • 操作系统返回套接字描述符(sd)

  • 第一个参数(协议族):protofamily = PF_INET (TCP/IP)

  • 第二个参数(套接字类型):

    • type = SOCK_STREAM,SOCK_DGRAM or SOCK_RAW(TCP/IP)
  • 第三个参数(协议号):0为默认

例:创建一个流套接字的代码段

struct protoent *p;
p = getprotobyname("tcp");
SOCKET sd = socket(PF_INET,SOCK_STREAM,p->p_proto);

不同类型的socket用于应用层与下层不同协议进行沟通。需要注意的是原始套接字SOCK_RAW需要拥有比较高的权限

在这里插入图片描述

TCP提供的服务特点:

可靠、面向连接、字节流传输、点对点

UDP提供的服务特点:

不可靠、无连接、数据报传输

Closesocket

int closesocket(SOCKET sd);
  • 关闭一个描述符为sd的套接字

  • 如果多个进程共享一个套接字,调用closesocket,将套接字引用计数减1,减至0才关闭

  • 一个进程中的多线程对一个套接字的使用无计数

    • 如果进程中的一个线程调用closesocket将一个套接字关闭,该进程中的其他线程也将不能访问该套接字
  • 返回值:0成功,SOCKET_ERROR不成功

bind

套接字创建的时候可能并没有地址 ,可以调用bind函数产生一个地址,或者说是用来绑定套接字的本地端点地址

int bind(sd,localaddr,addrlen);

端点地址其实就是IP地址 + 端口号

  • 参数

    • 套接字描述符 sd
    • 端点地址 localaddr,结构为sockaddr_in
    • 地址长度
  • 客户程序一般不必显式调用bind函数,因为操作系统会帮助我们设置客户端的端点地址

  • 对于服务器端需要调用,用来指定熟知端口号以及IP地址。如果服务器主机有多个网卡,产生多个ip地址,需要使用地址通配符,INADDR_ANY。表示在服务器运行的主机上任何一个可用ip地址都是可以用来传输的

listen

int listen(sd,queuesize);
  • 置服务器端的流套接字处于监听状态

    • 仅服务器端调用
    • 仅用于面向连接的流套接字
  • 设置连接请求队列(缓存)大小

  • 返回值: 成功为0,失败为SOCKET_ERROR

connect

connect(sd,saddr,saddrlen);
  • 客户程序调用connect函数来使客户套接字sd与特定计算机的特定端口saddr的套接字服务进行连接
  • 仅仅用于客户端
  • 可用于TCP客户端也可以用于UDP客户端
    • TCP客户端:建立了TCP连接
    • UDP客户端:只指定服务器端点地址

accept

newsock = accept(sd,caddr,caddrlen);
  • 服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道

    • 仅仅用于TCP套接字
    • 仅仅用于服务器
  • 利用新创建的套接字newsock与客户通信

为什么要这样做呢?因为TCP是点对点的,说明只能连接客户端和服务器的两个套接字。如果不这么做,就会导致TCP服务器在同一时刻只能为某一个客户提供服务,不能实现并发了。

在这里插入图片描述

send,sendto

send(sd,*buf,len,flags);
sendto(sd,*buf,len,flags,destaddr,addrlen);
  • send函数用于TCP套接字(客户与服务器)或调用了connect函数的UDP客户端套接字
    • sendto函数用于UDP服务器端套接字与为调用connect函数的UDP客户端套接字

recv,recvfrom

与上面的send、sendto对应

recv(sd,*buffer,len,flags);
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
  • recv函数从TCP连接的另一端接收数据,或者从调用了connect函数的UDP客户端套接字接收服务器发来的数据
  • recvfrom函数用于从UDP服务器套接字与未调用connect函数的UDP客户端套接字接收对端数据

setsockopt,getsockopt

int setsockopt(int sd,int level,int optname,*optval,int optlen);
int getsockopt(int sd,int level,int optname,*optval,int socklen_t* optlen);
  • setsockopt()函数用来设置套接字sd的选项参数
  • getsockopt()函数用来获取任意类型、人影状态的套接口的选项当前值,并吧结果存入optval

简单小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

需求变更流程不规范,项目早晚得完蛋

很多人,做的项目不少,但成功的不多。这是一个值得深思的问题。 项目为什么这么难做?需求蔓延,客户难搞是基本原因。 如何解决上述问题: 1)强化需求调研和项目设计在整个项目中的重要性 一般地,需…

html 表格套表格_HTML表格

html 表格套表格A table is a set of rows and columns, which could be created on a webpage in HTML, by <table> tag. The tabular representation of complex data makes it readable. 表格是一组行和列&#xff0c;可以通过<table>标签在HTML网页上创建。 复…

Android判断界面

仿造微信&#xff0c;第一次进入去引导界面&#xff0c;否则进启动界面。 package edu.hpu.init;import edu.hpu.logic.R;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.H…

HDU计算机网络系统2021复习提纲

目录计算机网络系统的主要功能TCP/IP模型与OSI模型的层次结构及各层功能。&#xff08;掌握&#xff09;TCP/IP参考模型各层次所对应的主要设备局域网的体系结构与IEEE.802标准数据链路层的编址方式和主要设备原理数据链路层CSMA/CD的技术原理交换机VLAN原理与划分方法数据链路…

ruby 线程id_Ruby中的线程

ruby 线程idRuby线程 (Ruby Threads) In Ruby, with the help of threads, you can implement more than one process at the same time or it can be said that Thread supports concurrent programming model. Apart from the main thread, you can create your thread with …

Dynamic web project --- AspectJ Project

本来想今天晚上 直接转到 以前的web项目 做测试。。。可惜在eclipse 添加 aspectj的时候 提示我不是 aspectj项目。。于是我就百度了好久&#xff0c;发现好多人都和我一样 &#xff0c; 不过我也发现了一些可以的 比如右键 AJDTtools --> convert to Aspectj Project ,可惜…

2013 南京邀请赛 A play the dice 求概率

1 /**2 大意&#xff1a;给定一个色子&#xff0c;有n个面&#xff0c;每一个面上有一个数字&#xff0c;在其中的m个面上有特殊的颜色&#xff0c;当掷出的色子出现这m个颜色之一时&#xff0c;可以再掷一次。。求其最后的期望3 思路&#xff1a;假设 期望为ans4 ans 1/…

掷骰子

Description: 描述&#xff1a; In this article, we are going to see a dynamic programing problem which can be featured in any interview rounds. 在本文中&#xff0c;我们将看到一个动态的编程问题&#xff0c;该问题可以在任何采访回合中体现。 Problem statement:…

《YOLO算法笔记》(草稿)

检测算法回顾 5、6年前的检测算法大体如下&#xff1a; 手动涉及特征时应该考虑的因素&#xff1a; 1、尺度不变性 2、光照不变性 3、旋转不变性 这一步骤称为特征工程&#xff0c;最重要的一个算法称为sift&#xff0c;(回顾SIFT讲解)体现了上述所有的观点。 在分类的过程中…

U盘安装Centos6.3

一 首先下载Centos6.3的光盘镜像文件&#xff0c;网上到镜像实在是太多了。 CentOS-6.3-i386-bin-DVD1.iso CentOS-6.3-i386-bin-DVD2.iso 二 下载个新版本的UltraISO, 在其菜单“启动”下有“写入硬盘镜像“功能到&#xff0c;原来用到绿色版本是8.6.2.2011不支持&#xff0c;…

[转]粵語固有辭彙與漢語北方話辭彙對照

本文转自&#xff1a;http://beta.wikiversity.org/wiki/%E7%B2%B5%E8%AA%9E%E5%9B%BA%E6%9C%89%E8%BE%AD%E5%BD%99%E8%88%87%E6%BC%A2%E8%AA%9E%E5%8C%97%E6%96%B9%E8%A9%B1%E8%BE%AD%E5%BD%99%E5%B0%8D%E7%85%A7 粵語固有辭彙與漢語北方話辭彙對照 「粵語」&#xff08;或稱「…

openlayer调用geoserver发布的地图实现地图的基本功能

转自&#xff1a;http://starting.iteye.com/blog/1039809 主要实现的功能有放大&#xff0c;缩小&#xff0c;获取地图大小&#xff0c;平移&#xff0c;线路测量&#xff0c;面积测量&#xff0c;拉宽功能&#xff0c;显示标注&#xff0c;移除标注&#xff0c;画多边形获取经…

LLVM与Codegen技术

LLVM 百度百科 LLVM是构架编译器(compiler)的框架系统&#xff0c;以C编写而成&#xff0c;用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)&#xff0c;对开发者保持开放&#xff0c;并兼容已有…

跟乌克兰人学编程1

今天要Disable一个菜单&#xff0c;工程项目多&#xff0c;不容易找。 乌克兰人建议我用Spy&#xff0c;将靶拖到目标窗体上就可以看到类名。转载于:https://www.cnblogs.com/SunWentao/archive/2012/12/19/2825220.html

html网页转图片_HTML图片

html网页转图片HTML图片 (HTML Images) Images are visuals of something that look elegant. In web pages, images are used to create a good and appealing design. 图像是外观精美的视觉效果。 在网页中&#xff0c;图像用于创建良好且吸引人的设计。 The <img> ta…

Android学习拾遗

1. java中的flush()作用&#xff1a;强制将输出流缓冲区的数据送出。 2. 文件存储&#xff1a; 存储到内部&#xff1a;另外使用一个class实现&#xff0c;最开始初始化用了this,后来放在这里不合适&#xff0c;改成了带参数的构造方法。 包括存储、读取、追加 读取&#xff1a…

OLAP 技术之列式存储与数据压缩(快查询方法之一)

前言 列式存储和数据压缩&#xff0c;对于一款高性能数据库来说是必不可少的特性。一个非常流行的观点认为&#xff0c;如果你想让查询变得更快&#xff0c;最简单且有效的方法是减少数据扫描范围和数据传输时的大小&#xff0c;而列式存储和数据压缩就可以帮助我们实现上述两…

sql 视图嵌套视图_SQL视图

sql 视图嵌套视图SQL | 观看次数 (SQL | Views) Views in SQL are virtual tables. A view also has rows and columns as theyre during a real table within the database. We will create a view by selecting fields from one or more tables present within the database.…

Postgresql多线程hashjoin(inner join)

pg hashjoin 节点大致步骤&#xff1a; 1、分块与分桶。对一个表hash时&#xff0c;确定块数和桶数量。&#xff08;一块被划分为10个元组的桶&#xff09;确定分块号与分桶号是由hashvalue决定的。 2、执行&#xff1a; 1、顺序获取S表中所有元组&#xff0c;对每一条元组Has…

iframe实现局部刷新和回调--开篇

今天做项目遇到一个问题。就是提交表单的时候&#xff0c;验证用户名是否存在和验证码是否正确。 当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本file里面符合要求的值刷新没了。用户体验不好。因为用ifream刷新技术已不是什么新鲜技术。所以网上有大把的资料可参考…