`

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

阅读更多

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.但是不影响.

分享到:
评论

相关推荐

    Linux-Socket-服务器编程实例.pptx

    在本实例中,我们将创建一个简单的TCP服务器,它监听客户端的连接请求,并在连接建立后,向客户端发送特定的字符串并关闭连接。下面将详细解释相关知识点。 首先,我们来看所需的头文件: 1. `&lt;stdlib.h&gt;`:这是...

    QT_的socket_与_Linux_的socket通信Linux

    本部分提供了一个具体的例子,演示了如何在QT程序中与Linux Socket API进行交互。该示例同时包含了客户端和服务端的实现。 #### 客户端代码 ```cpp #include "client.h" #include Client::Client(QObject *parent...

    linux C 编程一站式学习 最新版

    - 在C语言入门部分,讲解了如何进行程序的调试和第一个程序的编写; - 在理解函数部分,讲解了函数的返回语句、增量式开发、递归等高级概念; - 在数组部分,讲解了如何使用数组进行统计随机数和直方图的绘制; - 在...

    嵌入式Linux程序设计案例与实验教程-实例代码

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的...

    嵌入式Linux应用程序开发标准教程(第2版全)

    《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初学者能快速入门提供了保证。...

    LinuxSocketProgrammingbyExample

    书中提供的实例代码不仅仅是简单的Hello World级别的程序,而是涵盖了实际应用中的各种场景,如聊天服务器、文件传输、DNS查询等。通过这些项目,读者可以更深入地理解Socket编程的实际运用。 总之,《Linux Socket...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    嵌入式Linux的驱动实例

    `hello.c` 通常是一个简单的“Hello, World!”程序,用于演示如何调用和使用驱动程序。这个程序可能会初始化驱动,执行一些基本的操作,然后显示一个消息,表明驱动已经成功加载和运行。 最后,头文件如`cs8900.h` ...

    C语言实现Linux下的socket文件传输实例

    服务器端的核心任务是创建一个监听socket,等待客户端的连接请求,并在接收到连接时建立一个新的socket与客户端通信。 1. 包含必要的头文件: - `&lt;netinet/in.h&gt;`:包含`sockaddr_in`结构体定义,用于IP地址和端口...

    linux编程白皮书

    对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    JAVA程序实例(视频)

    其次,【hello小程序运行】是JAVA入门的经典案例,它涉及到JAVA程序的基本结构,如`public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } }`。这个小程序展示了...

    嵌入式学习步骤嵌入式学习步骤.doc

    本资源提供了一个完整的嵌入式学习步骤,涵盖了 LINUX 基础、Shell 编程、C 编程、嵌入式系统开发、串口通信、多进程和多线程程序设计、嵌入式 Linux 网络编程、GUI 程序开发和 Linux 字符设备驱动程序等方面的知识...

    嵌入式Linux应用程序开发详解

    目录 第1章 Linux快速入门 1 1.1 嵌入式Linux基础 1 1.1.1 Linux发展概述 1 1.1.2 Linux作为嵌入式操作系统的优势 2 ...12.3 实验内容——使用Qt编写“Hello,World”程序 420 本章小结 428

    LINUX编程白皮书

    对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 ...

Global site tag (gtag.js) - Google Analytics