socket编程 做一回文抄公
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编程 做一回文抄公的更多相关文章
- socket编程之并发回射服务器3
在socket编程之并发回射服务器一文中,服务器采用多进程的方式实现并发,本文采用多线程的方式实现并发. 多线程相关API: // Compile and link with -pthread int ...
- socket编程之并发回射服务器2
承接上文:socket编程之并发回射服务器 为了让服务器进程的终止一经发生,客户端就能检测到,客户端需要能够同时处理两个描述符:套接字和用户输入. 可以使用select达到这一目的: void str ...
- socket编程之并发回射服务器
使用到的函数: // 子进程返回0,父进程返回子进程ID,出错返回-1 pid_t fork(void); pid_t wait(int *wstatus); // 最常用的option是WNOHAN ...
- socket编程之时间回射服务器
使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...
- Python 基础之socket编程(二)
Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...
- 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 ...
- 【Aizu2292】Common Palindromes(回文树)
[Aizu2292]Common Palindromes(回文树) 题面 Vjudge 神TMD日语 翻译: 给定两个字符串\(S,T\),询问\((i,j,k,l)\)这样的四元组个数 满足\(S[ ...
- BZOJ2342:[SHOI2011]双倍回文
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://www.lydsy.com/JudgeOnline ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
随机推荐
- poj2481 Cows 树状数组
题目链接:http://poj.org/problem?id=2481 解题思路: 这道题对每组数据进行查询,是树状数组的应用.对于二维的树状数组, 首先想到排序.现在对输入的数据按右值从大到小排序, ...
- poj1743 Musical Theme 后缀数组的应用(求最长不重叠重复子串)
题目链接:http://poj.org/problem?id=1743 题目理解起来比较有困难,其实就是求最长有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1 ...
- POJ1019-Number Sequence数学
题目链接:http://poj.org/problem?id=1019 题目大意: 题目的意思很清楚了,就是把数字的每一位都当成是单个的字母来对待,然后求第i位的数是哪一个.(1<=i<= ...
- Python 基础之基本数据类型
首先,Python中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建.在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象 ...
- Java学习笔记——设计模式之三.装饰模式
函数应该做一件事,做好这件事,只做这一件事. --Clean Code 装饰模式,上代码: 先定义零件类: package cn.no3.decorator.template; public abst ...
- struts2.3.23升级到struts2.3.32
新的漏洞 3月8号去审计厅培训系统的使用,那边计算机中心的负责人递过来一张如下图所示的文档,意思是发现了struts2的漏洞,需要进行修复. 在培训前,我登录到服务器中,看到了项目中,所有的服务器中应 ...
- [原创]Nexus5 源码下载、编译、真机烧录过程记录
asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点 ...
- PHP开发微信模版消息换行的问题
微信是个坑!微信是个坑!微信是个坑!重要的时间说三遍 关键的地方是空白换行符到底是什么也不说,百度说是"\n":但是在发送消息的时候发现原样输出,发现json_encode对\n进 ...
- 机器学习:Python实现聚类算法(一)之AP算法
1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法.AP算法的基本思想是将全部数据点都 ...
- mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)
binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计.binary log 相关参数:log_bin设置此参数表示启用binlog功能,并指定路径名称log_bin_ind ...