head first c<11>初探网络编程上「建议收藏」

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。

}

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115434.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Elasticsearch搜索引擎:ES的segment段合并原理

    Elasticsearch搜索引擎:ES的segment段合并原理

    2021年10月5日
    158
  • OpenCV中出现“Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005C8ECFFA80 处。”的异常[通俗易懂]

    OpenCV中出现“Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005C8ECFFA80 处。”的异常[通俗易懂]1致谢对于OpenCV的安装要感谢网友空晴拜小白提供的教程链接如下:https://blog.csdn.net/sinat_36264666/article/details/73135823?ref=myread#reply教程写的十分详细截图什么的也很好2问题描述今天在安装和测试OpenCV的时候遇到了这样的问题测试代码如下#include&lt;opencv2/opencv.hpp…

    2022年9月29日
    3
  • 记忆化搜索(搜索+dp思想)

    记忆化搜索(搜索+dp思想)一:简介(1)记忆化搜索即搜索+动态规划数组记录上一层计算结果,避免过多的重复计算算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存;一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解

    2022年7月26日
    11
  • 怎么安装纯净版win10_影视大全纯净版app下载

    怎么安装纯净版win10_影视大全纯净版app下载文章目录1.制作系统安装盘1.1准备U盘以及一台用来制作安装盘的电脑1.2下载WIN10安装包1.3制作完成的系统安装盘1.4U盘格式化应选择的文件系统2.安装WIN10操作系统前的准备2.1插入系统安装盘2.2设置U盘(系统安装盘)为第一启动项2.3注意:启动引导方式的选择2.4补充:磁盘分区格式(MBR分区和GPT分区)和启动引导(Legacy和UEFI)的关系3.开始安装WIN10操作系统3.1将系统直接安装到固态硬盘内(不分区)3.2将固态硬盘分区后,将系统安装到其中一个

    2022年8月11日
    8
  • Weblogic SSRF漏洞[通俗易懂]

    Weblogic SSRF漏洞[通俗易懂]1.漏洞描述weblogic中存在SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。2.影响版本weblogic10.0.2–10.3.6版本3.POChttp://192.168.42.145:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSear…

    2022年6月25日
    31
  • 渗透测试常用工具汇总_常用渗透测试工具

    渗透测试常用工具汇总_常用渗透测试工具——D&X安全实验室工欲善其事,必先利其器。回到过去的旧时代,渗透测试是一件非常困难的事,并且需要大量的手动操作。然而如今,渗透测试工具是”安全军火库”中最常使用的装备,一整套的自动化测试工具似乎不仅改造了渗透测试人员,甚至还可以增强计算机的性能,进行比以往更全面的测试。对渗透测试人员来说不用任何自动化工具对网站或者应用程序进行渗透测试是一件十分困难的事。因此选择一个正确的工具则变得尤为重要,正确的选择甚至占去了渗透测试成功的半壁江山。本篇文章就来和大家介绍一…

    2022年8月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号