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&lt;11&gt;初探网络编程上的更多相关文章

  1. head first c初探网络编程上

    server连接网络四部曲. 为了与外界沟通,c程序用数据流读写字节,比較经常使用的数据流有标准输入.标准输出.文件等. 假设想写一个与网络通信的程序.就须要一种新的数据流----------套接字. ...

  2. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  3. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  4. Android 网络编程--上传文件及相应的参数到服务器

    之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...

  5. 11. Go 语言网络编程

    Go 语言网络编程 Go语言在编写 web 应用方面非常得力.因为目前它还没有 GUI(Graphic User Interface 图形化用户界面)的框架,通过文本或者模板展现的 html 界面是目 ...

  6. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  7. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  8. 20155229——实验五《 Java网络编程及安全》

    20155229--实验五 Java网络编程及安全 实验内容 实验一: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ...

  9. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

随机推荐

  1. 不同语言的Unix时间戳

    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)ge ...

  2. Android WindowManager 监听返回键及home键

    一.监听home键盘,Android Home键系统负责监听,捕获后系统自动处理.有时候,我们需要监听home键处理自己的逻辑,监听方法如下: /** * 监听home键广播 */ private f ...

  3. Java异常的分类

    1. 异常机制       异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.       传 ...

  4. Android中TabHost嵌套TabHost

    在嵌套TabHost时,先后遇到了以下情况: 问题1:内部TabHos无显示,只显示了其中的一个Activity: 解决:按下文比对主子TabHos的布局文件和java文件并修改: 问题2:如上所做后 ...

  5. 使ViewFlipper中的WebView实现手势效果

    使ViewFlipper中的WebView实现手势效果   今天写Blog阅读器的时候遇到了这个问题,把它分享给大家,让同样是新手们少走冤枉路始初写这个功能的时候,用过了好多方法,也耗了不少时间去研究 ...

  6. HDU 1025-Constructing Roads In JGShining's Kingdom(最长不降子序列,线段树优化)

    分析: 最长不降子序列,n很大o(n^2)肯定超,想到了小明序列那个题用线段树维护前面的最大值即可 该题也可用二分搜索来做. 注意问题输出时的坑,路复数后加s #include <map> ...

  7. duilib combo控件,当鼠标滚动时下拉列表自动关闭的bug的修复

    转载请说明出处,谢谢~~ 群里有朋友提到了使用Combo控件时,当下拉列表出现,此时鼠标滚轮滚动,下拉列表就自动消失了.我看了一下源码,这个bug的修复很简单. CComboUI控件被单击时创建CCo ...

  8. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  9. Tkinter教程之Scale篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811313 '''Tkinter教程之Scale篇'''#Scale为输出限定范围的数字区间, ...

  10. jQuery-validate error messages in Twitter ...

    http://www.jefclaes.be/2012/11/jquery-validate-error-messages-in.html something satisfactory. In thi ...