`

Linux下基于TCP/IP的socket服务器与客户端的实现

    博客分类:
  • J2ME
阅读更多
1,TCP协议说明:
  TCP协议面向连接的协议,客户端与服务器要经过"三次握手"才能建立连接,保证数据正确性,保证数据顺序

以下是本人第一次接触与的一个简单的例子,也是本人第一次Linux下TCP,socket与C的第一个例子
程序说明:
  程序支持的自定义命令有:
    open   建立与服务器的连接
    open命令格式:open <服务器的IP地址> <服务器侦听的端口>
    send   向服务器发送数据
    end命令格式:send <要发送的信息内容
    close  断开与服务器的连接
    close命令格式:close
    help   系统的帮助信息
    help命令格式:help
    exit   退出系统
    exit命令格式:exit

用C实现的服务端代码如下:
头文件Deal.h代码:
/*
* Deal.h
*
*  Created on: 2008-10-22
*      Author: root
*/
#ifndef DEAL_H_
#define DEAL_H_
#define OPEN "open"
#define SEND "send"
#define CLOSE "close"
#define HELP "help"
#define EXIT "exit"
#define FLAG "a"
void reciev_str(const char *, int);
int get_command(const char *);
#endif /* DEAL_H_ */

实现的Deal.c代码:
/*
* Deal.c
*
*  Created on: 2008-10-22
*      Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Deal.h"
extern char flag[10];
extern char str1[1024];
extern char str2[10];
void reciev_str(const char *source,int len) {
int i, j, k, l;
k = 0, l = 0;
/*寻找第一个空格*/
for (i = 0; i < len; i++) {
  if (source == ' ') {
   k = i;
   break;
  }
}
/*寻找第二个空格*/
for (i = i + 1; i < len; i++) {
  if (source == ' ') {
   l = i;
   break;
  }
}
/*如果没有第一个空格*/
if (k == 0) {
  for (i = 0; i < len; i++) {
   flag = source;
  }
  flag = '\0';
  str1[0] = 'a';
  str1[1] = '\0';
  str2[0] = 'a';
  str2[1] = '\0';
} else /*如果有第一个空格*/{
  /*如果没有第二个空格*/
  if (l == 0) {
   for (i = 0; i < k; i++) {
    flag = source;
   }
   flag = '\0';
   for (i = i + 1, j = 0; i < len; i++, j++) {
    str1[j] = source;
   }
   str1[j] = '\0';
   str2[0] = 'a';
   str2[1] = '\0';
  } else /*如果有第三个空格*/{
   for (i = 0; i < k; i++) {
    flag = source;
   }
   flag = '\0';
   for (i = i + 1, j = 0; i < l; i++, j++) {
    str1[j] = source;
   }
   str1[j] = '\0';
   for (i = i + 1, j = 0; i < len; i++, j++) {
    str2[j] = source;
   }
   str2[j] = '\0';
  }
}
}
int get_command(const char *h) {
if (strcmp(h, OPEN) == 0) {
  return 1;
}
if (strcmp(h, SEND) == 0) {
  return 2;
}
if (strcmp(h, CLOSE) == 0) {
  return 3;
}
if (strcmp(h, HELP) == 0) {
  return 4;
}
if (strcmp(h, EXIT) == 0) {
  return 5;
}
return -1;
}

客户端主要文件Client.c代码:
/*
* Client.c
*
*  Created on: 2008-10-22
*      Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h> /*for gethostbyname*/
#include "Deal.h"
char flag[10];
char str1[1024];
char str2[10];
void open_conn(int fd, struct sockaddr *addr)
{
if (connect(fd, addr, sizeof(struct sockaddr)) == -1)
{
  perror("connected fail!");
  exit(1);
}
}
void send_msg(int nfd, char *buf, int size)
{
if (write(nfd, buf, size) == -1)
{
  perror("send fail!");
  exit(1);
}
printf("send to server successful\n");
}
void help(char *h, char *info)
{
if (strcmp(h, HELP) == 0)
{
  if (strcmp(info, FLAG) == 0)
  {
   printf("用法:help [要帮助的命令]([]里为可选项)\n");
   printf("支持的帮助命令有:\n");
   printf(" open   建立与服务器的连接。\n");
   printf(" send   向服务器发送数据。\n");
   printf(" close  断开与服务器的连接。\n");
   printf(" help   系统的帮助信息。\n");
   printf(" exit   退出系统。\n");
  }
  else if (strcmp(info, OPEN) == 0)
  {
   printf("open命令格式:open <服务器的IP地址> <服务器侦听的端口>\n");
   printf("open命令的使用方法,例如:open 127.0.0.1 1080\n");
  }
  else if (strcmp(info, SEND) == 0)
  {
   printf("send命令格式:send <要发送的信息内容>\n");
   printf("send命令的使用方法,例如:send hello\n");
  }
  else if (strcmp(info, HELP) == 0)
  {
   printf("help命令格式:help\n");
   printf("help命令的使用方法,例如:help\n");
  }
  else if (strcmp(info, CLOSE) == 0)
  {
   printf("close命令格式:close\n");
   printf("close命令的使用方法,例如:close\n");
  }
  else if (strcmp(info, EXIT) == 0)
  {
   printf("exit命令格式:exit\n");
   printf("exit命令的使用方法,例如:exit\n");
  }
}
}
int main(int argc, char **argv)
{
int sock_fd;
struct sockaddr_in serv_addr;
char buf[1024];
struct hostent *host;
int cmd;
while (1)
{
  printf(">");
  gets(buf);
  reciev_str(buf, sizeof(buf));
  cmd = get_command(flag);
  switch (cmd)
  {
  case 1:
   if ((host = gethostbyname(str1)) == NULL)
   {
    perror("gethostbyname fail!");
    continue;
   }
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(atoi(str2));
   serv_addr.sin_addr = *((struct in_addr *) host->h_addr);
   bzero(&(serv_addr.sin_zero), 8);
   if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
   {
    perror("socket fail!");
    continue;
   }
   open_conn(sock_fd, (struct sockaddr *) &serv_addr);
   break;
  case 2:
   send_msg(sock_fd, str1,sizeof(str1));
   break;
  case 3:
   close(sock_fd);
   break;
  case 4:
   help(flag, str1);
   break;
  case 5:
   exit(0);
   break;
  default:
   exit(1);
   break;
  }
}
}

服务器主要文件Server.c代码:
/*
* Server.c
*
*  Created on: 2008-10-22
*      Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MSG_SIZE 1024
#define BACKLOG 10
#define FIRST_COMM "./TCP_Server"
#define SECOND_COMM "--port"
#define PORT "1080"

int main(int argc, char *argv[])
{
if (argc != 3 && (strcmp(argv[0], FIRST_COMM) != 0) && (strcmp(argv[1],
   SECOND_COMM) != 0) && (strcmp(argv[2], PORT) != 0))
{
  printf("please use like this:./TCP_Server --port 1080\n");
  exit(1);
}
int sock_fd, new_fd;
struct sockaddr_in serv_addr, dest_addr;
socklen_t sin_len;
int recv_byte;
char buf[MSG_SIZE];
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
  perror("socket fail!");
  exit(1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi(PORT));
serv_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(serv_addr.sin_zero), 8);
if (bind(sock_fd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr))
   == -1)
{
  fprintf(stderr, "bind port %s fail!\n", PORT);
  exit(1);
}
if (listen(sock_fd, BACKLOG) == -1)
{
  perror("listen fail!");
  exit(1);
}
printf("listenning......\n");
sin_len = sizeof(dest_addr);
if ((new_fd = accept(sock_fd, (struct sockaddr *) &dest_addr, &sin_len))
   == -1)
{
  perror("accept fail!");
  exit(1);
}
printf("A client has connected to me.\t%s:%d\n", inet_ntoa(
   dest_addr.sin_addr), ntohs(dest_addr.sin_port));
while (1)
{
  if ((recv_byte = read(new_fd, buf, MSG_SIZE)) < 0)
  {
   perror("read fail!");
   continue;
  }
  else if (recv_byte == 0)
  {
   printf("A current client has disconnected to me.\n");
   break;
  }
  else
  {
   buf[recv_byte] = '\0';
   printf("RECEIVE:%s\n", buf);
  }
}
close(new_fd);
close(sock_fd);
return 0;
}
<!--v:3.2-->
<!--E 文章--><!--S 翻页-->

分享到:
评论

相关推荐

    tcp/ip聊天室.rar

    在本项目中,"tcp/ip聊天室.rar" 是一个包含了实现基于TCP/IP协议的聊天室应用的资源包。这个聊天室的设计与实现充分利用了网络编程中的核心技术,包括TCP/IP套接字、多线程以及数据库存储。以下是这些关键知识点的...

    Linux下基于TCP/IP协议的文件传输

    通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现服务器端和客户端之间网络文件的收发。

    ARM linux 和上位机windows10进行TCP/IP网络通信

    在本文中,我们将深入探讨如何实现ARM Linux与Windows 10上位机之间的TCP/IP网络通信。这个主题涉及多个技术领域,包括操作系统间的通信、网络编程以及特定的编程语言和库。以下是一份详细的概述: 1. **TCP/IP协议...

    中国科学技术大学TCP/IP Socket网络编程的PPT

    - 这部分可能会讲解如何构建一个基本的TCP或UDP网络程序,包括客户端和服务器端的实现。 - 通过示例,学生可以理解数据是如何在不同层次被封装和传递的,例如应用层的数据会被加上TCP头、IP头以及以太网头,然后...

    TCP/IP Socket测试sample

    通过分析和学习这个TCP/IP Socket测试sample,开发者可以掌握网络通信的基础,理解客户端和服务器之间的交互流程,以及如何处理并发连接和数据传输。这对于开发网络应用,如即时通讯软件、文件传输服务、在线游戏等...

    北京邮电大学TCP/IP Socket网络编程

    通过深入理解和实践TCP/IP Socket网络编程,开发者可以构建可靠的网络应用程序,如Web服务器、FTP客户端、邮件服务等,从而参与和推动互联网的发展。北京邮电大学的这门课程为学习者提供了宝贵的资源,有助于提升...

    Linux内核源码剖析:TCP IP实现(上册).pdf

    在Linux内核中,TCP/IP协议栈实现了这一系列协议的功能,使得Linux系统能够作为服务器或者客户端进行网络通信。 ### 二、TCP/IP协议栈基础知识 #### 1. 协议层次结构 TCP/IP模型分为四层:应用层、传输层、网络层...

    Linux下用GTK开发基于TCP/IP的网络聊天室

    在Linux操作系统中,使用GTK(GIMP Toolkit)开发基于TCP/IP的网络聊天室是一项涉及到多方面技术的任务。GTK是一款强大的跨平台GUI库,用于创建美观的用户界面,而TCP/IP协议族则是互联网通信的基础,提供了可靠的...

    基于TCP/IP的网络围棋

    网络编程是实现基于TCP/IP的应用程序的关键,包括创建服务器和客户端程序。服务器端通常使用socket监听特定的端口,等待客户端的连接。一旦连接建立,服务器可以接收客户端发送的棋局请求,如落子位置,然后将响应...

    Linux系统TCP/IP编程

    本教程将深入探讨如何在Linux环境中构建TCP/IP通信程序,以及如何利用Linux提供的丰富的系统调用和函数来实现这一目标。 首先,TCP(传输控制协议)和IP(互联网协议)是Internet协议栈中的两个关键层,它们构成了...

    基于TCP/IP和Sqlite3数据库的网络通讯录

    【基于TCP/IP和Sqlite3数据库的网络通讯录】是一个使用C语言编写的程序,它在Linux环境下运行,实现了基本的通讯录管理功能,包括添加、删除、修改和查询联系人信息。这个项目结合了网络通信和本地数据存储两大核心...

    TCP/IP 下载上传文件

    本话题主要探讨如何在Linux操作系统环境下,使用C语言实现基于TCP/IP的文件上传与下载功能。以下将详细介绍相关知识点: 首先,我们需要理解TCP/IP协议族。TCP(传输控制协议)和IP(互联网协议)是最核心的两个...

    Linux下TCP/IP协议CS服务器模型

    本话题将深入探讨在Linux下如何构建一个基于TCP/IP协议的CS服务器模型。 首先,让我们理解TCP/IP协议。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它确保数据包按照正确的顺序到达...

    追踪LINUX TCP/IP代码运行一

    本文旨在深入探索Linux环境下TCP/IP协议栈的实现与运作机制,通过跟踪分析Socket编程接口的具体实现细节来理解网络通信的基础原理。文章从Socket编程的角度出发,不仅介绍了Socket的基本概念,还详细阐述了如何通过...

    linux C语言TCP/IP协议连接通讯

    总结,Linux下使用C语言进行TCP/IP通信涉及的知识点包括:socket编程接口、TCP/IP协议原理、连接建立与断开、数据传输以及错误处理。熟练掌握这些内容,能帮助开发者构建稳定、高效的网络应用程序。

    Linux TCP/IP网络编程中的Socket流程详解

    内容概要:详细讲解了在Linux环境中TCP/IP网络模型中Socket的应用过程及其核心机制,重点介绍了Socket的概念、意义及其实现过程,通过对服务器端和客户端程序代码的实际分析,让读者更加深刻地理解这一网络通信的...

    追踪linux TCP/IP 代码运行_光盘文件2

    在Linux系统中,TCP/IP...理解并追踪Linux TCP/IP代码运行涉及众多细节,包括协议实现、内核数据结构、系统调用流程等。通过学习和实践,我们可以更深入地了解网络通信的底层机制,有助于解决网络问题和优化系统性能。

    Linux下TCP/IP的Server、Client源码

    本文将深入讲解如何使用C语言编写Linux下的TCP/IP服务器(Server)和客户端(Client)程序,并通过提供的压缩包文件“TCPIP”中的源代码进行解析。 首先,我们要理解TCP/IP的基本工作原理。TCP(Transmission ...

    linux TCP/ip协议栈源码分析

    而TCP部分则涵盖了TCP用户代码、数据报文格式、栈及socket的初始化、服务器端bind、listen、accept的实现、客户端connect发起三次握手的过程,以及TCP报文的接收和三次握手的实现。 通过这份文档,读者可以获得对...

Global site tag (gtag.js) - Google Analytics