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

简介:

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

/* *
 * Tcp Server program, It is a simple example only.
 * zhengsh 200520602061 2
 * when client connect to server, send a welcome message and timestamp in server.
  
*/
 

#include  <stdio.h> 
#include  <sys/socket.h> 
#include  <unistd.h> 
#include  <sys/types.h> 
#include  <netinet/ in.h> 
#include  <stdlib.h> 
#include  <time.h> 
 
#define  SERVER_PORT 20000   //   define the defualt connect port id 
#define  LENGTH_OF_LISTEN_QUEUE 10   //  length of listen queue in server 
#define  BUFFER_SIZE 255 
#define  WELCOME_MESSAGE "welcome to connect the server. " 

int main( int argc,  char** argv)
{
       int  servfd,clifd;
       struct  sockaddr_in servaddr,cliaddr;

       if  ((servfd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
         {
              printf( " create socket error!\n " );
              exit( 1 );
       }
 
 
       bzero( & servaddr, sizeof (servaddr));

       servaddr.sin_family  =  AF_INET;
       servaddr.sin_port  =  htons(SERVER_PORT);
       servaddr.sin_addr.s_addr  =  htons(INADDR_ANY);

       if  (bind(servfd,( struct  sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )
         {
              printf( " bind to port %d failure!\n " ,SERVER_PORT);
              exit( 1 );
       }
 
 
        if  (listen(servfd,LENGTH_OF_LISTEN_QUEUE)  <   0 )
         {
              printf( " call listen failure!\n " );
              exit( 1 );
       }
 
 
        while  ( 1 )
         // server loop will nerver exit unless any body kill the process 

              char  buf[BUFFER_SIZE];
              long  timestamp;
              socklen_t length  =   sizeof (cliaddr);
              clifd  =  accept(servfd,( struct  sockaddr * ) & cliaddr, & length);

               if  (clifd  <   0 )
                {
                     printf( " error comes when call accept!\n " );
                     break ;
              }
 
 
              strcpy(buf,WELCOME_MESSAGE);

               // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE); 

              printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

              timestamp  =  time(NULL);

              strcat(buf, " timestamp in server: " );
              strcat(buf,ctime( & timestamp));

              send(clifd,buf,BUFFER_SIZE, 0 );

              close(clifd);           

       }
 // exit 
 
       close(servfd);

        return   0 ;
}


 客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
/*  Tcp client program, It is a simple example only.
 * zhengsh 200520602061 2
 * connect to server, and echo a message from server.
*/
 


#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/ in.h>
#include <stdlib.h> 


#define  SERVER_PORT 20000   //   define the defualt connect port id 
#define  CLIENT_PORT ((20001+rand())%65536)   //   define the defualt client port as a random port 
#define  BUFFER_SIZE 255 
#define  REUQEST_MESSAGE "welcome to connect the server.\n" 


void  usage( char* name)
{
       printf( " usage: %s IpAddr\n " ,name);
}



int  main( int argc,  char** argv)
{
       int  servfd,clifd,length = 0;
       struct  sockaddr_in servaddr,cliaddr;
       socklen_t socklen  =   sizeof (servaddr);
       char  buf[BUFFER_SIZE];

        if (argc < 2 )
         {
              usage(argv[ 0 ]);
              exit( 1 );
       }
 

       if ((clifd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
         {
             printf( " create socket error!\n " );
             exit( 1 );
       }
 
 
       srand(time(NULL)); // initialize random generator 
 
       bzero( & cliaddr, sizeof (cliaddr));
       cliaddr.sin_family  =  AF_INET;
       cliaddr.sin_port  =  htons(CLIENT_PORT);
       cliaddr.sin_addr.s_addr  =  htons(INADDR_ANY);

       bzero( & servaddr, sizeof (servaddr));
       servaddr.sin_family  =  AF_INET;
       inet_aton(argv[ 1 ], & servaddr.sin_addr);
       servaddr.sin_port  =  htons(SERVER_PORT);
      // servaddr.sin_addr.s_addr = htons(INADDR_ANY); 

       if  (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 )
       {
              printf( " bind to port %d failure!\n " ,CLIENT_PORT);
              exit( 1 );
       }
 

        if (connect(clifd,( struct  sockaddr * ) & servaddr, socklen)  <   0 )
       {
              printf( " can't connect to %s!\n ", argv[ 1 ]);
              exit( 1 );
       }
 

       length  =  recv(clifd, buf, BUFFER_SIZE, 0);
        if  (length < 0)
        {
              printf( " error comes when recieve data from server %s! ", argv[1] );
              exit( 1 );
       }
 

       printf( " from server %s :\n\t%s", argv[1], buf);

       close(clifd);
       return 0;
}
 



程序在Fedora core 4下通过编译,有几个warining.但是不影响.
目录
相关文章
|
4月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
239 6
|
5月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
742 2
|
5月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
79 2
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
88 1
|
3月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
192 1
|
4月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
55 5
|
Linux Python
Python全栈之路:Linux下的HelloWorld
Python全栈之路:Linux下的HelloWorld
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
141 8
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
558 6
|
2月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
104 3