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

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

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.c

/**
 * 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;
} 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Linux socket 编程实例,展示了如何实现一个简单的客户端和服务器程序: 服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8888 int main() { int server_fd, client_fd, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建 socket 文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置 socket 选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定 socket 到指定地址和端口号 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听 socket if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受客户端连接 if ((client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 从客户端接收数据 valread = read(client_fd, buffer, 1024); printf("%s\n", buffer); // 向客户端发送数据 send(client_fd, hello, strlen(hello), 0); printf("Hello message sent\n"); return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT 8888 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 创建 socket 文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将 IPv4 地址从点分十进制转换为二进制格式 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接到服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 向服务器发送数据 send(sock, hello, strlen(hello), 0); printf("Hello message sent\n"); // 从服务器接收数据 valread = read(sock, buffer, 1024); printf("%s\n", buffer); return 0; } ``` 以上代码实现了一个简单的客户端和服务器程序,客户端向服务器发送 "Hello from client" 字符串,服务器接收到后向客户端发送 "Hello from server" 字符串。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值