head first c<11>初探网络编程上
server连接网络四部曲。
为了与外界沟通,c程序用数据流读写字节。比較经常使用的数据流有标准输入、标准输出、文件等。
假设想写一个与网络通信的程序。就须要一种新的数据流----------套接字。
使用套接字与client程序通信前,server须要历经四个阶段:绑定、监听、接受、開始。
1.绑定port
计算机可能同一时候执行多个server程序。为了放置不同的对话混淆。每项服务必须使用不同的port(port)。port就好像电视频道,
用不同的频道接受不同的节目。
server在启动时。须要告诉操作系统将要使用哪个port,这个过程叫port绑定。为了绑定它你须要两样东西:套接字描写叙述符和套
接字名。
#include<sys/socket.h>
int listener_d = socket(PF_INET,SOCK_STREAM,0);
if (listene_d == -1)
error("无法打开套接字");
当中listener_d为套接字描写叙述符,绑定用bind函数
#include <arpa/inet.h> //为了创建互联网地址
....
struct sockaddr_in name;
name.sin_family = PF_INET;
name.sin_port = (in_port_t)htons(30000); //创建一个表示互联网30000端口的套接字名
name.sin_addr.s_addr =htonl(INADDR_ANY);
int c = bind(listener_d,(struct sockaddr *) &name,sizeof(name));
if (c == -1)
error("无法绑定port");
2.监听
if (listen(listen_d),10) ==1) //队列长度为10
error("无法监听")。
把队列长度设为10,也就是说最多能够有10个client同一时候尝试连接server,它们不会马上得到响应,但能够排队等候。而第十一个
client会被告知server忙。
3.接受连接
一旦帮顶完port。设置为监听队列。唯一能够做的就是等待。
server的一生都在等待有client来连接他们。直到有client连接server时,它会返回第二个套接字描写叙述符。然后就能够通信了。
struct sockaddr_storage client_addr; //保存连接客户端的具体信息
unsigned int address_size = sizeof (client_addr);
int connect_d = accept(listener_d,(struct sockaddr *)&client_addr,&address_size);
if (connect_d == -1)
error("无法打开副套接字");
server将用新的连接描写叙述符connect_d
4.開始通信
socket套接字这个数据流是双向的,既能够用作输入也能够用作输出。
假设想向套接字输出数据。就要用send()函数。而不是fprint()
char *msg = "xxxxxxxxxxx"
if (send(connect_d,msg,strlen(msg),0) == -1)
error("send")。
注:怎样选择port号
仅仅有超级用户或管理员才有资格使用1024号一下的port。由于小号的port留给了一些知名服务。如网页server和邮件server。
操作系统仅仅同意管理员用这些port。防止普通用户启动一些多余的服务。
因此,通常情况下请使用1024以上的port。
绑定port有延时
当你绑定某个port和套接字时,在接下来的30秒内。操作系统不同意不论什么程序再绑定它。包含上次绑定它的程序。这样万一你的
服务端瞬间重新启动了一下,也没办法立马绑定那个port,造成client得不到响应。
int reuse =1; //须要用一个整形变量来保存选项,设为1,表示又一次使用port
if (setsockopt(listener_d,SOL_SOCKET,SO_REUSEADDR,(char *)&reuse,sizeof(int)) == -1)
error ("无法设置又一次使用");
从client读数据。recv()函数
<读了几个字节> =recv(<描写叙述符>。<缓冲区>,<要读几个字节>,0)。
注:
<1>字符串不以\0结尾。
<2>在telnet输入文本时。字符串以\r\n结尾
<3>recv()返回字符个数,如错误发生则返回-1,假设client关闭了连接,则返回0
<4>recv调用不一定能一次接受全部字符,它意味着可能须要多次调用recv()
recv()用起来十分繁琐,最好把它封装在某个函数中,比方以下这个函数,它指定数组中保存以\0结尾的字符串
int read_in(int socket, char *buf,int len)
{
char *s =buf ;
int slen =len;
int c =recv(socket,s,slen,0);
while((c>0) && (s[c-1]!='\n'))
{
s +=c;
slen -=c;
c=recv(socket,s,slen,0);
}
if (c<0)
return c;
else if (c == 0)
buf[0]='\0';
else
s[c-1]='\0';
return len-slen。
}
head first c<11>初探网络编程上的更多相关文章
- head first c初探网络编程上
server连接网络四部曲. 为了与外界沟通,c程序用数据流读写字节,比較经常使用的数据流有标准输入.标准输出.文件等. 假设想写一个与网络通信的程序.就须要一种新的数据流----------套接字. ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
- Android 网络编程--上传文件及相应的参数到服务器
之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...
- 11. Go 语言网络编程
Go 语言网络编程 Go语言在编写 web 应用方面非常得力.因为目前它还没有 GUI(Graphic User Interface 图形化用户界面)的框架,通过文本或者模板展现的 html 界面是目 ...
- 初探网络编程--TCP套接字编程演示
今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- 20155229——实验五《 Java网络编程及安全》
20155229--实验五 Java网络编程及安全 实验内容 实验一: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
随机推荐
- POJ 1860 Currency Exchange
题意:有n种货币,可以互相兑换,有m个兑换规则,兑换规则给出汇率r和手续费c,公式为b = (a - c) * r,从a货币兑换为b货币,问能不能通过不断的兑换赚钱,兑换期间手中的钱数不可以为负. 解 ...
- Android智能聊天机器人
http://www.tuling123.com/ 注册一个账号,申请一个KEY值.此网站也有文档,可以查看. package com.tulingdemo; import java.te ...
- 利用ASP.NET MVC源代码调试你的应用程序[转]
由于项目需要,最近学起asp.net mvc.昨天遇到ViewData和TempData他们之间的分别这样让我纠结的问题.有园友强烈建议我去看ASP.NET MVC的源代码.所以,我想到如何在调试AS ...
- VS中使用QT调用R脚本
一开始想直接把R编译成库然后调用R,后来查了n多资料,发现VS中是无法办到的,官方也给出了一句话,大概意思就是没可能在VS中使用R提供的C++接口,大概是涉及到了底层的ABI的原因,具体也不太清楚. ...
- 欧拉图 CCF2016第六次 送货
// 欧拉图 CCF2016第六次 送货 // 思路: // CCF数据很水....这道题有问题 // 先判连通,再dfs边. // 应为输出要满足字典序最小,用vector存图,sort一遍,用st ...
- MFC 解析xml文件
CComVariant IXMLDOMElement http://blog.sina.com.cn/s/blog_69e905cd0100kp5i.html
- 【转】Phonegap离线调用SQLite数据库文件
按:不可多得的好文章,转过来以免源丢失 文章来源:http://liuwei.co/index.php/default/The-quickest-way-to-execute-many-sql-for ...
- C++ 我想这样用(七)
话接前篇,继续基于对象编程语法的剩余部分: 6.类的const成员函数和const对象 const数据成员:跟const常量一样,只是一个在类里(而且是在构造函数里),一个在类外而已,都必须初始化. ...
- C++多态分析(polymorphisn)
前言 借着这次学校的生产实习来回顾下C++的多态,这里讨论下C++的多态以及实现原理.我都是在QT下使用C++的,就直接在QT下进行演示了 多态介绍 面向对象语言中最核心的几个理念就是:封装.继承.多 ...
- lucene学习笔记:三,Lucene的索引文件格式
Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...