socket接口是TCP/IP网络的API,socket接口定义了许多函数或例程,程序员能够用他们来研发TCP/IP网络上的应用程式。要学Internet上的TCP/IP网络编程,必须理解socket接口。

socket接口设计者最先是将接口放在Unix操作系统里面的。假如了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的socket数据传输是一种特别的I/O,socket也是一种文档描述符。socket也具备一个类似于打开文档的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的socket类型有两种:SOCK_STREAM和SOCK_DGRAM。STREAM是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接的socket,对应于无连接的UDP服务应用。

使用socket进行网络编程,首先需要创建一个socket,创建一个tcp类型的socket的代码如下:

int fd = socket(AF_INET, SOCK_STREAM, 0);

创建socket后,为了使用这个fd还需要为它绑定ip地址,代码如下:

sockaddr_inaddr;

addr.sin_family = AF_INET;

addr.sin_port = 0;

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

int err = bind(fd, (sockaddr*)&addr, sizeof(socketaddr_in));

ipv4版本的socket编程中,网络地址用 sockaddr_in来表示:

 struct sockaddr_in{

     shorts in_family;

     /*Addressfamily一般来说AF_INET(地址族)PF_INET(协议族)*/

     unsigned shorts in_port;

     /*in_port必须采用网络数据格式,可以用htons()转换成网络数据格式*/

     struct in_addr sin_addr; /*ip 地址*/

     unsigned char sin_zero[8];

     /*没有实际意义,只是为了跟SOCKADDR结构在内存中对齐*/

 };

 struct in_addr{

     union{

         struct{unsigned char s_b1,s_b2,s_b3,s_b4;}S_un_b;

         struct{unsigned short s_w1,s_w2;}S_un_w;

         unsigned long S_addr;

     }S_un;

 };

使用bind函数将fd和地址绑定到一起:

 int bind(int fd, const struct sockaddr * address, socklen_t address_len);

在bind之后,就可以使用这个socket进行网络通信。

sockaddr_inaddraddr.sin_family = AF_INET;

addr.sin_port=htons(PORT);

addr.sin_addr.s_addr = inet_addr(SERVER_IP);

interr = connect(fd, (sockaddr*)&addr, sizeof(addr));

connect函数原型:

 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

参数说明:

serv_addr:远端服务器地址

 addrlen:描述地址的结构体sockadd_in的长度

返回值:如果函数执行成功,返回值为0,否则为非0

远端服务器接收连接的代码如下:

int err = listen(fd, 5);

sockaddr_in addr;

int len = sizeof(addr);

err = accept(fd, (sockaddr*)&addr, &len);

listen函数原型:

 int listen(intsockfd,int backlog);

参数说明:

 sockfd:一个已绑定未被连接的套接字描述符

 backlog:连接请求队列(queue of pending connections)的最大长度(一般由2

TCP协议下发送数据的代码如下:

int len = send(fd, buf, len, 0);

send函数原型:

 int send(int sockfd, const void * buff, size_t nbytes, int flags);

参数说明:

 sockfd:指定发送端套接字描述符。

 buff:存放要发送数据的缓冲区

 nbytes:实际要改善的数据的字节数

 flags:一般设置为0

返回值:若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小

TCP协议下接受数据的代码如下:

int len = recv(fd, buff, nbytes, 0);

recv函数原型:

 int recv(int sockfd, void * buff, size_t nbytes, int flags);

参数说明:

     sockfd:接收端套接字描述符

     buff:用来存放recv函数接收到的数据的缓冲区nbytes:指明buff的长度  

     flags:一般置为0

UDP协议下发送数据的代码如下:

int len = sendto(s,buffer,len,0,&addr,addr_len);

sendto函数原型:

int sendto(int fd, char * buf, int len, int flags,

            const struct sockaddr * to, int tolen);

参数说明:

 fd:套接字

 buf:待发送数据的缓冲区

 size:缓冲区长度

 flags:调用方式标志位, 一般为0, 改变flags,将会改变sendto发送的形式

 addr:目的地址

 len:描述地址的结构体sockadd_in的长度

UDP协议下接受数据的代码如下:

int len = recvfrom(fd,buf,buflen,0,(sockaddr*)&addr,&len);

recvfrom函数原型:

 int recvfrom(int fd, void * buf,int len, unsigned int flags,

              struct sockaddr * from, socket_t * fromlen);

参数说明:

     fd:标识一个已连接套接口的描述字。

     buf:接收数据缓冲区。

     len:缓冲区长度。

     flags:调用操作方式。

from:(可选)指针,指向保存发送地址的缓冲区。用于返回发送地址

     fromlen:(可选)指针,指向from缓冲区长度值。

 

self.processlagerbuf

socket编程 做一回文抄公的更多相关文章

  1. socket编程之并发回射服务器3

    在socket编程之并发回射服务器一文中,服务器采用多进程的方式实现并发,本文采用多线程的方式实现并发. 多线程相关API: // Compile and link with -pthread int ...

  2. socket编程之并发回射服务器2

    承接上文:socket编程之并发回射服务器 为了让服务器进程的终止一经发生,客户端就能检测到,客户端需要能够同时处理两个描述符:套接字和用户输入. 可以使用select达到这一目的: void str ...

  3. socket编程之并发回射服务器

    使用到的函数: // 子进程返回0,父进程返回子进程ID,出错返回-1 pid_t fork(void); pid_t wait(int *wstatus); // 最常用的option是WNOHAN ...

  4. socket编程之时间回射服务器

    使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...

  5. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

  6. PAT A1024 Palindromic Number (25 分)——回文,大整数

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  7. 【Aizu2292】Common Palindromes(回文树)

    [Aizu2292]Common Palindromes(回文树) 题面 Vjudge 神TMD日语 翻译: 给定两个字符串\(S,T\),询问\((i,j,k,l)\)这样的四元组个数 满足\(S[ ...

  8. BZOJ2342:[SHOI2011]双倍回文

    浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://www.lydsy.com/JudgeOnline ...

  9. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

随机推荐

  1. 酷睿彩票合买代购网站管理系统 v2016 - 源码下载 有合买功能 有免费版 标准版 高级版

    源码介绍 免费版下载地址 电信 浙江腾佑 网鼎科技 正易网络下载 联通 网鼎联通   标准版联系QQ:1395239152 彩票合买代购网站管理系统公司独立开发,完全拥有软件自主知识产权.具有电脑We ...

  2. [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words

    题意:问在一个词典里,那些单词是复合词,即哪些单词是由两个单词拼出来的. 渣渣代码:(Accepted, 30ms) //UVa10391 - Compound Words #include<i ...

  3. NIO Socket编程实例

    1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; ...

  4. Oracle 12C 新特性之 PDB热克隆(本地克隆、远端异机克隆)

    说明:版本12.2.0.1 12c r1版本中 clone 一份PDB源库需要打开在read only只读模式 , 在12c r2版本中引入了local undo mode, 源PDB在read/wr ...

  5. 惊艳发现VS工具python项目Search Paths的应用

    之前,在没有发现VS工具python项目Search Paths的应用时,举个例子:假如项目的文件目录如下: maintest/maintest.py想要使用common/tools.py文件时,不得 ...

  6. 多线程编程-- part 3 多线程同步->synchronized关键字

    多线程同时访问一个资源,可以会产生不可预料的结果,所以为这个资源加锁,访问资源的第一个线程为其加锁后,其他线程便不能在使用那个资源,直到锁被解除. 举个例子: 存款1000元,能取出800的时候我就取 ...

  7. Linux盘符绑定槽位

    服务器下的硬盘主有机械硬盘.固态硬盘以及raid阵列,通常内核分配盘符的顺序是/dev/sda./dev/sdb- -.在系统启动过程中,内核会按照扫描到硬盘的顺序分配盘符(先分配直通的,再分配阵列) ...

  8. Vulkan Tutorial 08 交换链

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 在这一章节,我们了解一下将渲染图像提交到屏幕的基本机制.这种机制成为交换链,并且需要 ...

  9. 30多个Android 开发者工具 带你开发带你飞

    文中部分工具是收费的,但是绝大多数都是免费的. FlowUp 这是一个帮助你跟踪app整体性能的工具,深入分析关键的性能数据如FPS, 内存, CPU, 磁盘, 等等.FlowUp根据用户数量收费. ...

  10. 使用SQL语句使数据从坚向排列转化成横向排列(排班表)

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...