linux下网络编程学习——入门实例

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html

是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵。

一起来:

诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 :

1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求。
2)在网络的某台机器上,用户执行客户机程序
3)客户机进行与服务器进程建立一条连接
4)连接建立后,客户机通过网路向服务器发出请求,请求某种服务。
5)服务器接收到客户机的请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回。
6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求。

现在介绍一个实例

功能:实现简单的服务器-客户机编程,客户机发送连接请求后接受到连接成功信息。
代码包括两部分,服务器部分(service.c)和客户机部分(client.c)

 1 /*service.c*/
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <errno.h>
 5 #include <string.h>
 6 #include <sys/types.h>
 7 #include <netinet/in.h>
 8 #include <sys/socket.h>
 9 #include <sys/wait.h>
10 #define MYPORT 3490 /*开放的端口号*/
11 #define BACKLOG 5  /*指定套接字可以接受的最大未接受客户机请求的数目*/
12 main()
13 {
14 int sockfd,new_fd;
15 struct sockaddr_in srvaddr;
16 struct sockaddr_in cliaddr;
17 int sin_size;
18 /*创建套接字描述符*/
19 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
20 {
21       perror("socket error");
22       exit(1);
23 }
24 bzero(&srvaddr,sizeof(srvaddr));
25 /*用自己的ip地址和端口信息填充一个internet套接字地址结构*/
26 srvaddr.sin_family=AF_INET;                 
27 srvaddr.sin_port=htons(MYPORT);
28 /*函数bind将服务器的地址和套接字帮定在一起*/
29 if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)
30 {
31       perror("bind error");
32       exit(1);
33 }
34 /*listen函数告诉内核,这个套接字可以接受来自客户机的请求*/
35 if(listen(sockfd,BACKLOG)==-1)
36 {
37       perror("listen error");
38       exit(1);
39 }
40 /*处理客户机的请求,调用函数accept来获得一个客户机的连接*/
41 for(;;)
42 {
43       sin_size=sizeof(struct sockaddr_in);
44       if((new_fd=accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size))==-1)
45       {
46              perror("accept error");
47              continue;
48       }
49       printf("server: got connection from %s \n",inet_ntoa(cliaddr.sin_addr));
50 /*向客户起写数据*/
51       if(write(new_fd,"Hello,Network!\n",14)==-1)
52                     perror("write error!");
53       close(new_fd);
54 }
55       close(sockfd);
56 }

下面为client:

 1 /*client.c*/
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <errno.h>
 5 #include <string.h>
 6 #include <netdb.h>
 7 #include <sys/types.h>
 8 #include <netinet/in.h>
 9 #include <sys/socket.h>
10 #define PORT 3490
11 #define MAXDATASIZE 5000
12 int main(int argc,char **argv)
13 {
14 int sockfd,nbytes;
15 char buf[1024];
16 struct hostent *he;
17 struct sockaddr_in srvaddr;
18 if(argc!=2)
19 {
20 perror("Usage:client hostname\n");
21 exit(1);
22 }
23 /*函数gethostbyname获得指定域名地址所对应的ip地址*/
24 if((he=gethostbyname(argv[1]))==NULL)
25 {
26       perror("gethostbyname");
27       exit(1);
28 }
29 /*创建套接字,返回套接字描述符*/
30 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
31 {
32       perror("create socket error");
33       exit(1);
34 }
35 bzero(&srvaddr,sizeof(srvaddr));
36 /*用获得的远程服务器进程的ip地址和端口号来填充一个internet套接字地址结构*/
37 srvaddr.sin_family=AF_INET;
38 srvaddr.sin_port=htons(PORT);
39 srvaddr.sin_addr=*((struct in_addr *)he->h_addr);
40 /*用connect于这个远程服务器建立一个internet连接*/
41 if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)
42 {
43       perror("connect error");
44       exit(1);
45 }
46 /*调用read函数读取服务器write过来的信息*/
47 if((nbytes=read(sockfd,buf,MAXDATASIZE))==-1)
48 {
49       perror("read error");
50       exit(1);
51 }
52 buf[nbytes]=‘\0‘;
53 printf("read: %s",buf);
54 close(sockfd);
55 }

下面我们来编译执行看看效果哦

编译:
#gcc -o service service.c
#gcc -o client client.c
修改执行权限
#chmod 770 service
#chmod 770 client
执行
现执行服务器端哦
#./service
另开一个命令行窗口,连接服务器的3490端口
#./client localhost
呵呵,看到效果了吧
服务器端:

server: got connection from 127.0.0.1

客户端

read: Hello,Network!

原文地址:https://www.cnblogs.com/xjyxp/p/11142133.html

时间: 2024-08-10 19:11:22

linux下网络编程学习——入门实例的相关文章

linux下网络编程学习——入门实例ZZ

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

Linux下网络编程学习杂记

1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)->网络层->网络接口层(负责将二进制流转换成数据帧,并进行数据帧的发送和接收)->硬件层. 2.服务器是指能在网络上提供服务的任何程序:客户机是指用户为了得到某种服务所需运行的应用程序. 3.网络通信即为进程间的通信,套接口就是网络进程的ID.使用端口号和网络地址的组合能够唯一确定整个网路中的一个

linux下网络编程常见问题

网络程序异常退出无core文件产生 这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core.为了避免退出,一般在启动的时候加上 signal(SIGPIPE, SIG_IGN) 来忽略这种错误. 发送端send成功,但是接收端却recv失败 send只是表示数据copy到了发送缓冲区,并不代表数据到达了recv,若这时候网络出问题,对面确实收不到数据. 如何让接受方知道发送方每次发送的数据

Linux C++ 网络编程学习系列(2)——多路IO之select实现

select实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/select 源码说明: server.cpp: 监听127.1:6666,功能是将收到的小写转大写 include/wrap.cpp: 封装的一些socket基本操作,加了基本的错误处理 1. 概要 int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *rest

转 网络编程学习笔记一:Socket编程

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

网络编程学习笔记一:Socket编程

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.So

网络编程学习笔记:Socket编程

文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.accept()函数 3.5.read().write()函数等 3.6.close()函数 4.socket中TCP的三次握手建立连接详解 5.socket中TCP的四次握手释放连接详解 6.一个例子(实践一下) 1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方

Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定