开发者社区> 杨粼波> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux Socket编程实例(一个Hello World程序)

简介:
+关注继续查看

在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现!

ExpandedBlockStart.gif/* *
InBlock.gif * Tcp Server program, It is a simple example only.
InBlock.gif * zhengsh 200520602061 2
InBlock.gif * when client connect to server, send a welcome message and timestamp in server.
ExpandedBlockEnd.gif  
*/
 
None.gif
None.gif#include  <stdio.h> 
None.gif#include  <sys/socket.h> 
None.gif#include  <unistd.h> 
None.gif#include  <sys/types.h> 
None.gif#include  <netinet/in.h> 
None.gif#include  <stdlib.h> 
None.gif#include  <time.h> 
None.gif 
None.gif#define  SERVER_PORT 20000  //  define the defualt connect port id 
None.gif#define  LENGTH_OF_LISTEN_QUEUE 10  // length of listen queue in server 
None.gif#define  BUFFER_SIZE 255 
None.gif#define  WELCOME_MESSAGE "welcome to connect the server. " 
None.gif
None.gifint main(int argc, char** argv)
ExpandedBlockStart.gif{
InBlock.gif       int  servfd,clifd;
InBlock.gif       struct  sockaddr_in servaddr,cliaddr;
InBlock.gif
InBlock.gif       if  ((servfd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
ExpandedSubBlockStart.gif         {
InBlock.gif              printf( " create socket error!\n " );
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif 
InBlock.gif       bzero( & servaddr, sizeof (servaddr));
InBlock.gif
InBlock.gif       servaddr.sin_family  =  AF_INET;
InBlock.gif       servaddr.sin_port  =  htons(SERVER_PORT);
InBlock.gif       servaddr.sin_addr.s_addr  =  htons(INADDR_ANY);
InBlock.gif
InBlock.gif       if  (bind(servfd,( struct  sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )
ExpandedSubBlockStart.gif         {
InBlock.gif              printf( " bind to port %d failure!\n " ,SERVER_PORT);
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif 
InBlock.gif        if  (listen(servfd,LENGTH_OF_LISTEN_QUEUE)  <   0 )
ExpandedSubBlockStart.gif         {
InBlock.gif              printf( " call listen failure!\n " );
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif 
InBlock.gif        while  ( 1 )
ExpandedSubBlockStart.gif         // server loop will nerver exit unless any body kill the process 
InBlock.gif

InBlock.gif              char  buf[BUFFER_SIZE];
InBlock.gif              long  timestamp;
InBlock.gif              socklen_t length  =   sizeof (cliaddr);
InBlock.gif              clifd  =  accept(servfd,( struct  sockaddr * ) & cliaddr, & length);
InBlock.gif
InBlock.gif               if  (clifd  <   0 )
ExpandedSubBlockStart.gif                {
InBlock.gif                     printf( " error comes when call accept!\n " );
InBlock.gif                     break ;
ExpandedSubBlockEnd.gif              }
 
InBlock.gif 
InBlock.gif              strcpy(buf,WELCOME_MESSAGE);
InBlock.gif
InBlock.gif               // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE); 
InBlock.gif

InBlock.gif              printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
InBlock.gif
InBlock.gif              timestamp  =  time(NULL);
InBlock.gif
InBlock.gif              strcat(buf, " timestamp in server: " );
InBlock.gif              strcat(buf,ctime( & timestamp));
InBlock.gif
InBlock.gif              send(clifd,buf,BUFFER_SIZE, 0 );
InBlock.gif
InBlock.gif              close(clifd);           
InBlock.gif
ExpandedSubBlockEnd.gif       }
 // exit 
InBlock.gif
 
InBlock.gif       close(servfd);
InBlock.gif
InBlock.gif        return   0 ;
ExpandedBlockEnd.gif}


 客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
ExpandedBlockStart.gif/*  Tcp client program, It is a simple example only.
InBlock.gif * zhengsh 200520602061 2
InBlock.gif * connect to server, and echo a message from server.
ExpandedBlockEnd.gif
*/
 
None.gif
None.gif
None.gif#include <stdio.h>
None.gif#include <sys/socket.h>
None.gif#include <unistd.h>
None.gif#include <sys/types.h>
None.gif#include <netinet/in.h>
None.gif#include <stdlib.h> 
None.gif
None.gif
None.gif#define  SERVER_PORT 20000  //  define the defualt connect port id 
None.gif#define  CLIENT_PORT ((20001+rand())%65536)  //  define the defualt client port as a random port 
None.gif#define  BUFFER_SIZE 255 
None.gif#define  REUQEST_MESSAGE "welcome to connect the server.\n" 
None.gif
None.gif
None.gifvoid  usage(char* name)
ExpandedBlockStart.gif{
InBlock.gif       printf( " usage: %s IpAddr\n " ,name);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gifint  main(int argc, char** argv)
ExpandedBlockStart.gif{
InBlock.gif       int  servfd,clifd,length = 0;
InBlock.gif       struct  sockaddr_in servaddr,cliaddr;
InBlock.gif       socklen_t socklen  =   sizeof (servaddr);
InBlock.gif       char  buf[BUFFER_SIZE];
InBlock.gif
InBlock.gif        if (argc < 2 )
ExpandedSubBlockStart.gif         {
InBlock.gif              usage(argv[ 0 ]);
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif
InBlock.gif       if ((clifd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
ExpandedSubBlockStart.gif         {
InBlock.gif             printf( " create socket error!\n " );
InBlock.gif             exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif 
InBlock.gif       srand(time(NULL)); // initialize random generator 
InBlock.gif
 
InBlock.gif       bzero( & cliaddr, sizeof (cliaddr));
InBlock.gif       cliaddr.sin_family  =  AF_INET;
InBlock.gif       cliaddr.sin_port  =  htons(CLIENT_PORT);
InBlock.gif       cliaddr.sin_addr.s_addr  =  htons(INADDR_ANY);
InBlock.gif
InBlock.gif       bzero( & servaddr, sizeof (servaddr));
InBlock.gif       servaddr.sin_family  =  AF_INET;
InBlock.gif       inet_aton(argv[ 1 ], & servaddr.sin_addr);
InBlock.gif       servaddr.sin_port  =  htons(SERVER_PORT);
InBlock.gif      // servaddr.sin_addr.s_addr = htons(INADDR_ANY); 
InBlock.gif

InBlock.gif       if  (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 )
ExpandedSubBlockStart.gif       {
InBlock.gif              printf( " bind to port %d failure!\n " ,CLIENT_PORT);
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif
InBlock.gif        if (connect(clifd,( struct  sockaddr * ) & servaddr, socklen)  <   0 )
ExpandedSubBlockStart.gif       {
InBlock.gif              printf( " can't connect to %s!\n ", argv[ 1 ]);
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif
InBlock.gif       length  =  recv(clifd, buf, BUFFER_SIZE, 0);
InBlock.gif        if  (length < 0)
ExpandedSubBlockStart.gif        {
InBlock.gif              printf( " error comes when recieve data from server %s! ", argv[1] );
InBlock.gif              exit( 1 );
ExpandedSubBlockEnd.gif       }
 
InBlock.gif
InBlock.gif       printf( " from server %s :\n\t%s", argv[1], buf);
InBlock.gif
InBlock.gif       close(clifd);
InBlock.gif       return 0;
ExpandedBlockEnd.gif}
 
None.gif

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux Socket编程(不限Linux)【转】
转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。
864 0
linux下的socket编程
一、为什么要进行socket编程     Linux操作系统下,网络是一个非常重要的方面,它继承了Unix家族的网络优势。在Linux下进行网络程序设计,一般都使用socket。
777 0
Linux 习题练习-01(文件操作命令、压缩命令、软件安装)
Linux 习题练习-01(文件操作命令、压缩命令、软件安装)
126 0
Linux从零开始(三、命令图解)
Linux从零开始(三、命令图解)
49 0
【小知识】快速入手Linux yum 命令
【小知识】快速入手Linux yum 命令
62 0
+关注
杨粼波
网游的老兵
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ECS系统指南之Linux系统诊断
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
ECS运维指南 之 Linux系统诊断
立即下载