gcc -Wall ipv6-server.c -o ipv6server
gcc -Wall ipv6-client.c -o ipv6client
eth0 链路封装:以太网 硬件地址 00:14:2A:6D:5B:A5
inet 地址:192.168.0.167 广播:192.168.0.255 掩码:255.255.255.0
inet6 地址: fe80::214:2aff:fe6d:5ba5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:30507 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:26797 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:31461154 (30.0 MiB) 发送字节:4472810 (4.2 MiB)
中断:185 基本地址:0xe400
lo 链路封装:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收数据包:13 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:13 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1178 (1.1 KiB) 发送字节:1178 (1.1 KiB)
原帖由 converse 于 2007-1-29 18:13 发表
LZ你好,我看了你发的几个帖子,感觉不错,建议你整理到一个帖子里面这样以后查找方便也便于将你的想法系列化.我给你加原创精华,谢谢.
原帖由 converse 于 2007-2-3 22:32 发表
>>还请告诉我如何将此全部发到这里。
汗,你就把帖子一个一个的贴在这个帖子里面就好了,我敢打赌会N热门的~~
原帖由 zhoulifa 于 2007-2-4 12:23 发表
那我就当一回搬运工了。不过我觉得这种方式比较那个,好象与咱们信息化时代不太相符哦
gcc -Wall simple-socket.c
./a.out 127.0.0.1 22
gcc -Wall simple-bind.c
./a.out 127.0.0.1 22 127.0.0.1 3000
netstat -an|grep 3000
tcp 0 0 127.0.0.1:3000 127.0.0.1:22 ESTABLISHED
gcc -Wall simple-readall.c
./a.out 127.0.0.1 22 127.0.0.1 3000
读到10个字节,它们是:'SSH-2.0-Op'
读到10个字节,它们是:'enSSH_4.3p'
读到10个字节,它们是:'2 Debian-5'
读到8个字节,它们是:'ubuntu1
'
#define MAXBUF 10
#define MAXBUF 9
gcc -Wall simple-nonblock.c
./a.out 127.0.0.1 21 127.0.0.1 3000
数据还未到达!
读到10个字节,它们是:'220 (vsFTP'
读到10个字节,它们是:'d 2.0.4)
'
gcc -Wall simple-listen.c
./a.out 7838 2
./a.out 7838 2 127.0.0.1
gcc -Wall simple-accept.c
./a.out 7838 1 127.0.0.1
server: got connection from 127.0.0.1, port 15949, socket 4
server: got connection from 127.0.0.1, port 15950, socket 5
server: got connection from 127.0.0.1, port 15951, socket 6
server: got connection from 127.0.0.1, port 15952, socket 7
gcc -Wall simple-send.c
./a.out 127.0.0.1 7838 1
socket created
binded
begin listen
server: got connection from 127.0.0.1, port 13097, socket 4
消息'这是在连接建立成功后向客户端发送的第一个消息
只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息
'发送成功,共发送了227个字节!
server: got connection from 127.0.0.1, port 13099, socket 5
消息'这是在连接建立成功后向客户端发送的第一个消息
只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息
'发送成功,共发送了227个字节!
telnet 127.0.0.1 7838
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
这是在连接建立成功后向客户端发送的第一个消息
只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息
Connection closed by foreign host.
gcc -Wall simple-server.c -o server
gcc -Wall simple-client.c -o client
./server 7838 1
./client 127.0.0.1 7838
socket created
binded
begin listen
server: got connection from 127.0.0.1, port 32537, socket 4
消息'这是在连接建立成功后向客户端发送的第一个消息
只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息
'发送成功,共发送了227个字节!
接收消息成功:'这是客户端发给服务器端的消息
',共43个字节的数据
socket created
address created
server connected
接收消息成功:'这是在连接建立成功后向客户端发送的第一个消息
只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息
',共227个字节的数据
消息'这是客户端发给服务器端的消息
'发送成功,共发送了43个字节!
Name Purpose
PF_UNIX, PF_LOCAL Local communication
PF_INET IPv4 Internet protocols
PF_INET6 IPv6 Internet protocols
PF_IPX IPX - Novell protocols
PF_NETLINK Kernel user interface device
PF_X25 ITU-T X.25 / ISO-8208 protocol
PF_AX25 Amateur radio AX.25 protocol
PF_ATMPVC Access to raw ATM PVCs
PF_APPLETALK Appletalk
PF_PACKET Low level packet interface
SOCK_STREAM
Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism may be sup‐
ported.
SOCK_DGRAM
Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
SOCK_SEQPACKET
Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a con‐
sumer is required to read an entire packet with each read system call.
SOCK_RAW
Provides raw network protocol access.
SOCK_RDM
Provides a reliable datagram layer that does not guarantee ordering.
SOCK_PACKET
Obsolete and should not be used in new programs; see packet(7).
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
gcc -Wall simple-udpserver.c -o server
gcc -Wall simple-udpclient.c -o client
./server 127.0.0.1 7838
./client 127.0.0.1 7838
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
gcc -Wall broadc-udpclient.c -o client
./client 192.168.0.255 7838
以前面的文章<Linux网络编程一步一步学-UDP方式广播通讯>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:
./client 192.168.100.255 7838
则上图所示网络上的所有主机,只要其IP地址192.168.100.*与网络掩码(比如255.255.255.0)运算得到的子网(比如 192.168.100.0)与192.168.100.xa主机所在的子网是一样的,都会在自己的7838端口收到192.168.xa主机发出来的 UDP消息。消息会被复制并发到每个主机的网卡上去,网卡收到消息后提交给操作系统去处理,操作系统发现有程序在7838端口接收UDP数据则把消息转给相应的程序去处理,如果没有程序接收来自7838端口的UDP消息,则操作系统丢弃该消息。
以前面的文章<Linux网络编程一步一步学-客户端和服务器端互相收发消息>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:
./client 192.168.100.xf 7838
则消息只会从192.168.100.xa主机发到192.168.100.xf主机上,192.168.100.xf主机的网卡收到消息后转给操作系统去处理,操作系统再把此消息转给相应程序去处理,如果没有程序处理就丢弃该包。
以后面的文章<Linux网络编程一步一步学-UDP组播>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:
./mcastclient 230.1.1.1 7838
则消息只会从192.168.100.xa主机发到加入了组230.1.1.1的主机的7838端口。象广播一样,组播消息一样会被复制发到网络所有主机的网卡上,但只有宣布加入230.1.1.1这个组的主机的网卡才会把数据提交给操作系统去处理。如果没有加入组,则网卡直接将数据丢弃。
要想接收组播消息的主机必须运行命令加入组,如下方式:
./mcastserver 230.1.1.1 7838
gcc -Wall mcastclient.c -o mcastclient
gcc -Wall mcastserver.c -o mcastserver
./mcastserver 230.1.1.1 7838
./mcastclient 230.1.1.1 7838 192.168.100.1 12345
gcc -Wall sync-server.c -o server
gcc -Wall sync-client.c -o client
./server 7838 1
./client 127.0.0.1 7838
1、服务端程序开启
2、客户端程序开启(即客户端连接服务器)
3、服务器端用户输入消息并发送给客户端
4、客户端收到消息,客户端用户输入消息并发送给服务器端
5、服务器端收到消息,服务器端用户输入消息并发送给客户端
6、任何一方退出当前聊天即终止一次聊天过程
7、服务器端继续等待下一个人连接上来开始新的聊天过程
1、设置一个集合变量,用来存放所有要判断的句柄(file descriptors:即我们建立的每个socket、用open打开的每个文件等)
2、把需要判断的句柄加入到集合里
3、设置判断时间
4、开始等待,即select
5、如果在设定的时间内有任何句柄状态变化了就马上返回,并把句柄设置到集合里
gcc -Wall async-server.c -o server
gcc -Wall async-client.c -o client
./server 7838 1
./client 127.0.0.1 7838
gcc -Wall das-server.c -o das-server
./das-server
./das-server --port 7838
./das-server -P 7838
gcc -Wall telnet-server -o telnetd
./telnetd --daemon #以root用户身份在23端口(即telnet默认端口服务)
./telnetd -P 7838 #以非root用户身份
telnet 127.0.0.1
telnet 127.0.0.1 7838
[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
Baud = 115200
New PPPD = yes
Modem = /dev/modem
ISDN = 0
; Phone =
; Password =
; Username =
Phone = 拨号上网的电话号码
Password = 上网的用户名
Username = 上网的密码
pon wvdial
/etc/init.d/pppd-dns
/etc/init.d/ppp
/etc/init.d/pppstatus-clean
/etc/init.d/pppstatus
auto eth0
iface eth0 inet dhcp
DEVICE=eth0
BOOTPROTO=dhcp
onBOOT=yes
auto eth0
iface eth0 inet static
address 192.168.100.30
gateway 192.168.100.1
netmask 255.255.255.0
DEVICE=eth0
BOOTPROTO=none
onBOOT=yes
IPADDR=192.168.100.30
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
Package: libssl-dev
Priority: optional
Section: libdevel
Installed-Size: 5552
Maintainer: Debian OpenSSL Team
Architecture: i386
Source: openssl
Version: 0.9.8a-7ubuntu0.3
Depends: libssl0.9.8 (= 0.9.8a-7ubuntu0.3), zlib1g-dev
Conflicts: ssleay (<< 0.9.2b), libssl08-dev, libssl09-dev, libssl095a-dev, libssl096-dev
Filename: pool/main/o/openssl/libssl-dev_0.9.8a-7ubuntu0.3_i386.deb
Size: 2023440
MD5sum: 3c4052d07abe7d7984a774ca815ba4cf
SHA1: 29145b66372613e78c37d9ce0de6a7d1cfc7bac0
SHA256: 9e86aa1174a45e4f61e5afcb56d485ea60f90e31b0ecaf2bf31f426f7eb8c6eb
Description: SSL development libraries, header files and documentation
libssl and libcrypt development libraries, header files and manpages
.
It is part of the OpenSSL implementation of SSL.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu
Package: libssl-dev
Priority: optional
Section: libdevel
Installed-Size: 5548
Maintainer: Debian OpenSSL Team
Architecture: i386
Source: openssl
Version: 0.9.8a-7build1
Depends: libssl0.9.8 (= 0.9.8a-7build1), zlib1g-dev
Conflicts: ssleay (<< 0.9.2b), libssl08-dev, libssl09-dev, libssl095a-dev, libssl096-dev
Filename: pool/main/o/openssl/libssl-dev_0.9.8a-7build1_i386.deb
Size: 2022142
MD5sum: c9b989aebbae4f6f5dbde67207858023
Description: SSL development libraries, header files and documentation
libssl and libcrypt development libraries, header files and manpages
.
It is part of the OpenSSL implementation of SSL.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu
gcc -Wall saccept.c -o sslserver -lssl
gcc -Wall sconnect.c -o sslclient -l ssl
gcc -Wall https-client.c -lssl -o httpsclient
./httpsclient https://127.0.0.1/test.html
o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key
o Creation of X.509 Certificates, CSRs and CRLs # 创建证书
o Calculation of Message Digests #
o Encryption and Decryption with Ciphers # 加密、解密
o SSL/TLS Client and Server Tests # SSL 服务器端/客户端测试
o Handling of S/MIME signed or encrypted Mail # 处理签名或加密了的邮件
openssl genrsa -des3 -out privkey.pem 2048
openssl genrsa -out privkey.pem 2048
openssl req -new -key privkey.pem -out cert.csr
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
#define MAXEPOLLSIZE 10000
gcc -Wall epoll-server.c -o server
sudo ./server 7838 1
gcc -Wall ssl-client.c -o client
gcc -Wall ssl-server.c -o server
./server 7838 1 cacert.pem privkey.pem
./client 127.0.0.1 7838
openssl genrsa -out privkey.pem 2048
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
int socket(int domain, int type, int protocol);
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
fd_set rdfds; /* 先申明一个 fd_set 集合来保存我们要检测的 socket句柄 */
struct timeval tv; /* 申明一个时间变量来保存时间 */
int ret; /* 保存返回值 */
FD_ZERO(&rdfds); /* 用select函数之前先把集合清零 */
FD_SET(socket, &rdfds); /* 把要检测的句柄socket加入到集合里 */
tv.tv_sec = 1;
tv.tv_usec = 500; /* 设置select等待的最大时间为1秒加500毫秒 */
ret = select(socket + 1, &rdfds, NULL, NULL, &tv); /* 检测我们上面设置到集合rdfds里的句柄是否有可读信息 */
if(ret < 0) perror("select");/* 这说明select函数出错 */
else if(ret == 0) printf("超时\n"); /* 说明在我们设定的时间值1秒加500毫秒的时间内,socket的状态没有发生变化 */
else { /* 说明等待时间还未到1秒加500毫秒,socket的状态发生了变化 */
printf("ret=%d\n", ret); /* ret这个返回值记录了发生状态变化的句柄的数目,由于我们只监视了socket这一个句柄,所以这里一定ret=1,如果同时有多个句柄发生变化返回的就是句柄的总和了 */
/* 这里我们就应该从socket这个句柄里读取数据了,因为select函数已经告诉我们这个句柄里有数据可读 */
if(FD_ISSET(socket, &rdfds)) { /* 先判断一下socket这外被监视的句柄是否真的变成可读的了 */
/* 读取socket句柄里的数据 */
recv(...);
}
}
int sa, sb, sc;
sa = socket(...); /* 分别创建3个句柄并连接到服务器上 */
connect(sa,...);
sb = socket(...);
connect(sb,...);
sc = socket(...);
connect(sc,...);
FD_SET(sa, &rdfds);/* 分别把3个句柄加入读监视集合里去 */
FD_SET(sb, &rdfds);
FD_SET(sc, &rdfds);
int maxfd = 0;
if(sa > maxfd) maxfd = sa;
if(sb > maxfd) maxfd = sb;
if(sc > maxfd) maxfd = sc;
ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 */
FD_ZERO(&rdfds);
FD_SET(0, &rdfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select(1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 */
if(ret < 0) perror("select");/* 出错 */
else if(ret == 0) printf("超时\n"); /* 在我们设定的时间tv内,用户没有按键盘 */
else { /* 用户有按键盘,要读取用户的输入 */
scanf("%s", buf);
}
原帖由 marion 于 2007-2-5 01:21 发表
佩服佩服!!请问Lifa兄,想学C语言,应该如何实施?谢谢!
原帖由 zhoulifa 于 2007-2-5 14:54 发表
为了回答你这个问题,我今天专门写了这篇文章:
我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
准备写一系列“我是这样学习Linux下C语言编 ...
原帖由 arthasg 于 2007-2-22 22:40 发表
楼主大哥,你在程序中多次使用inet_aton函数,似乎这个函数已经被inet_pton取代了呢.
原帖由 zhoulifa 于 2007-2-26 08:51 发表
inet_pton是比inet_aton之类的函数要方便一些,但用inet_aton没什么不好,目前还是有不少在用的
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |