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

linux下网络编程学习——入门实例
作者: falcon   发表日期: 2006-04-14 09:54   复制链接



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

一起来:

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

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

现在介绍一个实例

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



Code:
/*service.c*/ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define MYPORT 3490 /*开放的端口号*/ #define BACKLOG 5 /*指定套接字可以接受的最大未接受客户机请求的数目*/ main() { int sockfd,new_fd; struct sockaddr_in srvaddr; struct sockaddr_in cliaddr; int sin_size; /*创建套接字描述符*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {     perror("socket error");     exit(1); } bzero(&srvaddr,sizeof(srvaddr)); /*用自己的ip地址和端口信息填充一个internet套接字地址结构*/ srvaddr.sin_family=AF_INET;             srvaddr.sin_port=htons(MYPORT); /*函数bind将服务器的地址和套接字帮定在一起*/ if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1) {     perror("bind error");     exit(1); } /*listen函数告诉内核,这个套接字可以接受来自客户机的请求*/ if(listen(sockfd,BACKLOG)==-1) {     perror("listen error");     exit(1); } /*处理客户机的请求,调用函数accept来获得一个客户机的连接*/ for(;;) {     sin_size=sizeof(struct sockaddr_in);     if((new_fd=accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size))==-1)     {         perror("accept error");         continue;     }     printf("server: got connection from %s \n",inet_ntoa(cliaddr.sin_addr)); /*向客户起写数据*/     if(write(new_fd,"Hello,Network!\n",14)==-1)               perror("write error!");     close(new_fd); }     close(sockfd); }
[Ctrl+A Select All]




Code:
/*client.c*/ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3490 #define MAXDATASIZE 5000 int main(int argc,char **argv) { int sockfd,nbytes; char buf[1024]; struct hostent *he; struct sockaddr_in srvaddr; if(argc!=2) { perror("Usage:client hostname\n"); exit(1); } /*函数gethostbyname获得指定域名地址所对应的ip地址*/ if((he=gethostbyname(argv[1]))==NULL) {     perror("gethostbyname");     exit(1); } /*创建套接字,返回套接字描述符*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {     perror("create socket error");     exit(1); } bzero(&srvaddr,sizeof(srvaddr)); /*用获得的远程服务器进程的ip地址和端口号来填充一个internet套接字地址结构*/ srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons(PORT); srvaddr.sin_addr=*((struct in_addr *)he->h_addr); /*用connect于这个远程服务器建立一个internet连接*/ if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1) {     perror("connect error");     exit(1); } /*调用read函数读取服务器write过来的信息*/ if((nbytes=read(sockfd,buf,MAXDATASIZE))==-1) {     perror("read error");     exit(1); } buf[nbytes]='\0'; printf("read: %s",buf); close(sockfd); }
[Ctrl+A Select All]



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

编译:
#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!

[注:以上程序在mandriva linux 2006下调试通过]

从此踏上linux下的网络编程之路,祝贺你一帆风顺...
Good Luck,Babies

你可能感兴趣的:(linux下网络编程学习——入门实例)