首页 > 编程语言 >socket编程的常见问题

socket编程的常见问题

时间:2022-10-29 23:02:58浏览次数:42  
标签:调用 socket 编程 程序 常见问题 我该 connect select



  • 英文小册原文地址:​​beej.us/guide/bgnet…​​
  • 作者:Beej
  • 中文翻译地址:​​www.chanmufeng.com/posts/netwo…​​

1. 我从哪获取这些头文件资料?

如果你的系统中没有自带这些文件,或许你根本就不需要他们。你得看一下你平台的使用手册。

对了,如果你是为Windows开发程序,你只需要​​#include <winsock.h>​​。

2. bind()报“Address already in use”异常怎么办?

你必须对正在监听的socket使用​​setsockopt()​​​函数,并设置 ​​SO_REUSEADDR​​​ 选项。看一下​​bind()​​​章节和​​select()​​章节中的例子,你就明白了。

3. 我该如何获取到系统中已经打开的socket列表?

使用​​netstat​​命令。使用细节你需要参考man手册,不过你只要输入下列指令就能获取到一些不错的信息:

$ netstat

4. 我该如何查看路由表(routing table)?

执行​​route​​​命令(多数的Linux系统是在​​/sbin​​​下),或者​​netstat -r​​指令。

5. 如果我只有一台电脑,我该怎么运行Client/Server程序?我需要连接外网吗?

幸运的事,所有系统都有一个回环(loopback)虚拟网络“设备”,这个设备位于内核中,并假装自己是个网卡(这家伙就是​​ifconfig​​​中列出的“​​lo​​”)。

假设你登陆一台名为“goat”的设备,并在一个窗口中运行了Client程序,在另一个窗口中运行了Server端程序。或者你也可以在后台运行Server程序(用​​server &​​),在另一个窗口中运行Client程序。

​loopback设备​​​的用处就是,你可以使用 ​​client goat​​​ 或者 ​​client localhost​​​ (因为“​​localhost​​​”已经在你的​​/etc/hosts​​中定义好了),这样你就可以让client在没有网络的情况下也可以与server通信。

简而言之,不需要改变任何代码,就可以让你的程序在没有网络的单机上运行!

6. 如果远程断开了连接,我该怎么知道呢?

你可以分辨,因为​​recv()​​​会返回​​0​​。

7. 我自己怎么实现“ping”这个小工具?啥是ICMP?我从哪儿能学到更多关于raw scoket和SOCK_RAW的知识?

你对​​raw socket​​​的全部疑问都可以在 ​​W. Richard Stevens’ UNIX Network Programming books​​这本书中找到答案。在Stevens’ UNIX Network Programming源代码的​​ping​​子目录中,你可以找到​​ping的源码​​。

8. 我该如何改变或缩短调用connect()的过期时间?

这个问题 W. Richard Stevens 已经回答了,我们就不狗尾续貂了。你可以参考UNIX Network Programming源代码中的 ​​lib/connect_nonb.c​​。

其要点是,使用​​socket()​​​创建一个socket descriptor,将其设置为​​non-blocking​​​,调用​​connect()​​​,如果一切顺利,​​connect()​​​将立即返回​​-1​​​,​​errno​​​将设置为​​EINPROGRESS​​​。然后,你可以调用​​select()​​​,并在​​read​​​和​​write​​​集合中传递socket descriptor。如果没有超时,则表示​​connect()​​​调用已完成。此时,你必须使用​​getsockopt()​​​设置​​SO_ERROR​​​选项,以获取​​connect()​​​调用的返回值,如果没有错误,该值应该为​​0​​。

最后,在你开始通过socket传输数据之前,你可能姜再将其设置为​​blocking​​。

这样做有一个好处,就是让你的程序在​​connecting​​​(连接期间)也可以做别的事情。比如:你可以将​​timeout​​​设置为500ms,并在每次​​timeout​​​时更新屏幕上的提示信息,然后再次调用​​select()​​​。当你调用​​select()​​并超时(例如,达到20次)时,你就知道是时候放弃这个连接了。

强烈建议你看看Stevens的源码,找个好例子研究一下。

9. 我该怎么写Windows网络程序?

首先,卸载Windows,然后装一个Linux或者BSD。。。。哈哈哈哈,开个玩笑。

给你个链接,你看一下​​section on building for Windows​​ 。

10. 我该如何在Solaris/SunOS上编译程序?我进行编译的时候总报linker error

链接器错误发生是因为 Sun 系统不会在套接字库中自动编译。参考一下​​这篇文章​​,其中于如何处理这个问题的范例。

标签:调用,socket,编程,程序,常见问题,我该,connect,select
From: https://blog.51cto.com/u_13887950/5806587

相关文章

  • 实验一 Java基础与结构化编程
     一、实验目的1.熟悉JDK开发环境。2.掌握JavaApplication的程序结构和开发过程。3.掌握Java语言基础。4.掌握分支语句。5.掌握循环语句。二、实验内容问题描述 掌握JavaApplic......
  • python 与C++ 利用socket实现json数据传输
    单机python与C++程序利用socket实现json数据传输目录单机python与C++程序利用socket实现json数据传输需求实现方法的选择具体实现流程图示涉及到的技术1socket......
  • 并发编程
    并发编程并发:多个进程在某个时间,一起运行并行:多个进程在某个时刻,一起运行python中对并发编程的支持多线程:threading模块,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴......
  • 二、编程语言介绍
    2.1、什么是编程语言编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样)。就像我们中国人之间沟通需要汉语,英国人沟通......
  • 各种编程语言的分类
    总述编程语言从最开始的机器语言到如今的百花齐放,已经经过了很长时间的发展。我们也在发展的过程中对拥有不同特性的语言进行了分类,但随着语言越来越多,越来越高级,许多语言......
  • 《Unix/Linux系统编程》第九周学习笔记
    《Unix/Linux系统编程》第九周学习笔记信号和中断中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。与发送给CPU的中断请求一样,“信......
  • (文件操作) 编程实现保存n行字符串内容到文本文件W_ANSI(GBK).txt中(该文件内容按GBK格式
    样例输入2汉字ABC 样例输出文件内容:[b'\xba\xba\xd7\xd6\r\n',b'ABC\r\n'] 样例输入3汉字ABCabc 样例输出文件内容:[b'\xba\xba\xd7\xd6\r\n',b......
  • Socket的长连接和短连接
    长连接与短连接所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接......
  • 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容
    废话不多说直接上代码:不清楚的加群:群:191065815privatevoidForm1_Load(objectsender,EventArgse){try{//更改设置......
  • redis常见问题(三)
    redis安装之后导致linux无法正常启动问题现象:在linux安装redis后,将redis设置为开机启动项,导致系统开机后停在redis启动界面,无法登陆系统,shell命令行也无法显示,如下图:问题原......