看到这篇文章写得挺清楚 就贴过来了
http://8-1.myrice.com/study/linux/linux.htm
*******************************************************
好了,我们开始吧,Socket,你一定很熟悉Socket这个词,无论是在windows还是linux,
只要你要telnet主机,或是用ftp上传文件到服务器,又或是用浏览器看网页,就一定会
用到他。
如果你是新手,你到这里来,已经走到了socket编程的第一步。假设你已经有C语言编
程的基础,我不想在这里多谈C语言
----------------------------------
既使你知道Socket这个词,既使你常听到人们谈到“Socket”,而你却不知道其确切含义
。其实他是使用文件描述符 和其他程序通讯的方式。
OK,在UNIX里,所有的东西都是文件,你的CDROM是文件,你的显示器是文件,
你的硬盘也是文件你的。。。也是文件。。。所以,你想和网络上其他程序通信的时
候就要通过文件描述符。那是真的,请你相信,我决不骗你。
现在你或许会想:我该怎么样得到网络通讯的文件描述符呢?你就要用到系统调用
socket(),他返回套接口文件描述符,然后你可以把这个文件描述符当作普通的文件来
操作,不过最好使用send()和recv(),这样比较好点,好处以后再说!
在internet上有多种套接口,不用惊奇,也不要感到害怕,因为常用的套接口只有两种
,那就是流式套接品和数据报套接口,而我这里要讲的只是流式套接口,对于数据报
套
接口只作简单的介绍。如果理解了流式套接口,其他的也就简单了。因为他们都是套接
口!
流式套接口可以提供可靠的双向通讯数据流,他们也是无错误的传递,在TCP里有自已
的错误控制。
使用流式套接口的例子很多,至少你的浏览器就在用!因为浏览其实就是telnet到主机的
80端口get页面,然后你可爱的netscapt或ie就可以看到网页html的内容了!
因为流式套接口使用的是传输控制协议(TCP)所以数据可以按顺序,到达并且不会出
错。或许你听说过TCP/IP,这里的IP指的是Internet协议,他用来处理Internet路由。
而数据报套接口可以提供更快的传输速率,但却是不可靠的。举个例子,你传送一组数
据123456789,可能到达时,他的次序已经乱了,可能是987456321了不过你可以放心,
IP路由会为你处理这个问题,他不使用TCP,而是使用UDP,一种叫“用户数据包协议”
的怪异东东,而且怪异到不用维持一个连接就能发送数据。只要数据包里构造一个IP头
,IP头里包括你要发送到的目的地信息。
“STOP!”你也许会被那些怪异的事搞的发疯,或许你还是无法理解什么是套接口,好吧
,让我们从一个程序开始吧!
Linux Socket 网络编程(二)
好了,现在我来解释一个前次的程序;
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
这些是必要和头文件
#define PORT 4567
#define BUFSIZE 512
常量定义,假设端口为4567,缓冲为512字节
int main(int argc,char** argv)
这就不用我解释了吧:)如果真不知道,去翻翻有关C语言的书吧!
{
int socketf,n;
char buf[BUFSIZE];
struct sockaddr_in server;
有必要解释一下sockaddr_in
这是一个internet 套接口结构,
struct in_addr {
in_addr_t s_addr; /* 32位IPV4地址 */
};
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* internet地址(32位IPV4) */
unsigned char sin_zero[8]; /* 不知道什么用,反正没用到过 */
};
对于sin_family,我们一般都填AF_INET,当然还有其他的,我们一般现在用的都还是
IPV4,如果你要用IPV6,这个就是AF_INET6啦!只是多加了一个6,就把32位IP地址变
成了128位,这个世界真是神奇(当然你还要做很多事)
sin_port是你的端口号,看到了吧,是16位的,所以端口号不会大于
0xffff啦;要注意的是
要把它转换成网络字节序,这就要用到以下四个函数了:
htons()
htonl()
ntohs()
ntohl()
是不是有些眼花了,这四个函数好像很像啊!对了,其实他们都是做同样的事,只是分
工不同
htons把16位本地字节序转换成16位网络字节序,ntohs刚好相反
htonl把32位本地字节序转换成32位网络字节序,ntohl刚好相反
告诉你们一个诀窍,这里的h代表host,n代表network,s代表short(16位),l代表long(32位)
这样是不是好记了点?只要你懂得英语里"to"这个单词的含义就行了!
好了,看看我们的IP地址,是in_addr结构.再深入一步看in_addr结构,
里面有
in_addr_t s_addr;
这里的in_addr_t其实就是unsigned int,不要被它的样子吓坏,其实它很可爱:)
所以我们填写IP地址的时候就要
...
struct sockaddr_in server;
...
server.sin_addr.s_addr=inet_addr("192.168.0.1");
inet_addr()可以把你的点分十进制IP地址变为计算机认识的IP地址;
仔细的人可能以经看出,我这里没有用htonl(),那是因为inet_addr已经把IP地址转换为
网络字节序了!真是聪明!噢,我指的是inet_addr()很聪明!
至于sin_zero[8];一般都是把它清空为0,不过为了方便,在初始化的时候把整个结构清
空;我们可以用bzero()和memset()不过用bzero更方便点,memset()功能更强大点,不过在
这里这两个都一样,我们就用bzero了!
OK,整个结构都说完了,现在回到我们的程序去吧!
if(argc!=2)
{
printf("%s","IP address error");
exit(-1);
}
当然,你不输入IP地址,你的程序当然不知道要连接到哪儿去啊!
if((socketf=socket(AF_INET,SOCK_STREAM,0)<=0)
{
printf("%s","socket error");
exit(-1);
}
这又是什么?socket()?哦,我忘了解释套接口描述字了!
还记得我以前说过,在UNIX里,什么东西都是文件吗?对,套接口也是文件,所以
也要用文件描述符,只是这里是套接口描述符而已,其实都差不多。
上面socketf=socket(AF_INET,SOCK_STREAM,0)就是为了得到这个套接口描述符。
AF_INET是必须的,如果用到的是IPV6这里就是AF_INET6了,SOCK_STREAM指明是
流式套接口,而不是数据报套接口(其实套接口的种类远不指这些,只是不想让大家多伤
脑细胞而已)。最后一个一定要填0,可能是为以后着想的吧!
bzero(&server,sizeof(server));
还记得这个bzero吗?我在前面说过的!对,把结构清空!为了方便,我们把整个结
构清空了!
server.sin_family = AF_INET;
server.port = htons(PORT);
server.sin_addr.s_addr=inet_addr(argv[1]);
好,填写套接口结构。看清最后一行了吗?怎么填IP地址。不过这里有个错误,因
为inet_addr在出错时返回-1,-1是什么?记得0xffffffff吗?这是什么?把它翻成点分
十进制吧,那就是255.255.255.255,这就是internet广播地址。0xffffffff第一位是符号
位,所以也是-1。真是历害,一出错就发广播了,是不是怕天下人不知道啊?
if(connetc(socketf,(struct sockaddr *)&server,sizeof(server))<0)
{
printf("%s","connetc error");
exit(-1);
}
得到了socketf,我们就可以连接了,这就要用到connetc了!
是不是该解释一个这个函数了?OK!第一个参数是套接口描述字,就是要连接上哪
个套接口。第二个是一个套接口结构地址指针,我们这里是server,当然要数据转换了,
因为一个是sockaddr,一个是sockaddr_in,虽然这两个其实差不多,不过转换还是必要的。
还是不明白?算了,还是好人做到底,把sockaddr这个结构也解释一下吧!
struct sockaddr {
unsigned short sa_family; /* 地族,当然也是 AF_xxx */
char sa_data[14]; /* 14 bytes 协议地址 */
};
啊,和我们的sockaddr_in差不多嘛,我没骗你吧,只是把sa_data[14]分得更小更多我们
把sockaddr_in里除了sa_family外其他的加起来,也刚好是14
bytes耶!如果有兴趣,
你也可以用sockaddr代替sockaddr_in,当然在实际编程中恐怕。。。很少或几乎是没
有人会这样做的吧!
好了,让我们回到connect吧,还有最后一个参数,说明要连接对向的大小,我们这
里是server大小~!
当然,如果连接出错我们就exit(-1);闪人喽~!
if(recv(socketf,buf,BUFSIZE,0)<0)
{
prinft("%s","recever error");
exit(-1);
}
else
printf("%s",buf);
recv(),接收数据,我这里就不发送了,从socketf接受BUFSIZE个字节的数据到buf里去;
close(socketf);
文件用完要关闭,套接口也是一样,要close(socketf);
}
最后不要忘了关门
分享到:
相关推荐
在这个“Java网络编程-Socket-文件传输小案例”中,我们将深入探讨如何利用Java的Socket API进行文件的传输。首先,我们需要了解Socket的基本概念。 Socket,通常被称为套接字,是网络编程中的一个接口,它允许两个...
Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-...
01_Linux网络编程-网络基础-socket编程-高并发服务器
Java网络编程中的Socket是应用程序通过TCP/IP协议进行通信的基础组件。Socket可以被理解为网络通信中的一个端点,它由IP地址和端口号两部分组成,这个定义来源于最初的TCP规范(RFC 793)。Socket有两种类型:流式...
本篇将深入讲解Socket在网络编程中的作用以及相关的知识点。 首先,Socket可以看作是两台计算机之间的通信管道,它提供了进程间通信(IPC,Inter-Process Communication)的能力,特别是在网络环境中的进程间通信。...
在实际的网络编程中,Socket类还提供了许多其他方法,如Close、Shutdown、BeginConnect/EndConnect、BeginReceive/EndReceive等,用于管理连接状态、关闭连接、异步数据传输等。此外,Socket类还支持套接字选项和...
网络编程中的Socket API是指一系列用于网络通信的编程接口,它允许程序员创建网络通信端点并进行数据传输。Socket API工作在应用层和传输层之间,提供了与传输层协议(如TCP和UDP)交互的接口。在这篇文档中,我们...
在Java编程领域,网络编程是不可或缺的一部分,而Socket通信则是实现网络数据传输的基础。本案例主要探讨了如何使用Java的Socket API进行简单的文件传输。在这个过程中,我们将涉及到以下几个关键知识点: 1. **...
【Linux网络编程-网络基础-socket编程-高并发服务器】 在深入探讨Linux下的网络编程之前,我们首先要理解网络通信的基础概念——协议。协议是数据传输和解释的规则,它确保了不同设备之间的通信能顺利进行。例如,...
不过,我们可以推断这个资源包可能包含了关于如何在易语言中使用HP-Socket进行网络编程的详细资料,包括源代码实例,这将帮助开发者更好地理解和应用该组件。 标签“socket”表明了这个主题与网络套接字编程有关,...
网络socket编程集锦,程序经过Linux平台PC上用 GNU 的gcc 成功编译过,适合新手学习借鉴。
### Linux网络编程-TCP/IP协议-Socket编程 #### 一、引言 随着互联网的不断发展,网络编程成为了软件开发中的重要组成部分。对于Linux系统而言,掌握网络编程的基础知识尤为重要。本篇文章将根据提供的资料深入探讨...
### Java编程中的Socket与网络编程详解 #### 一、Socket编程概述 Socket编程是Java网络编程的核心技术之一,主要用于实现不同计算机之间的通信。通过Socket,应用程序可以在网络上发送和接收数据,实现分布式系统...
总的来说,HP-Socket5.4.1为C#开发者提供了一个强大且易用的Socket通信工具,它简化了网络编程的复杂性,使得开发者可以更加专注于业务逻辑,而不是底层通信细节。通过深入了解并熟练使用这个库,开发者可以高效地...
Socket编程是网络编程的核心技术,主要用于实现不同计算机之间的通信,通过创建套接字接口,程序可以发送和接收数据。 【描述】:“本资源是自己读书期间的存档,仅供大家参考。可以自己执行修改。” 这表明资源的...
在Linux环境中,HP-Socket是一款高性能的网络通信库,它为开发者提供了强大的套接字编程接口,便于构建高效稳定的网络应用。本主题将详细介绍如何在Linux系统上编译和安装HP-Socket,以及与之相关的几个关键依赖库的...
这为开发者提供了方便,他们可以直接将库文件添加到自己的项目中,然后调用HP-Socket提供的接口进行网络编程。 总的来说,HP-Socket 5.8.1 rc1提供了强大的网络通信功能,包括源码、示例和更新日志,为开发者提供了...
总结来说,"基于HP-Socket的局域网通信工具(仿QQ)"项目涵盖了网络编程中的诸多关键知识点,包括网络通信框架的选择与应用、用户认证机制、数据库操作、数据安全以及实时消息传递。通过学习和实践这个项目,开发者...
TCP-Socket编程 UDP-Socket编程 知识点:TCP-Socket编程 TCP-Socket编程 Socket含义 socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 ...
Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...