`

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 翻页-->

分享到:
评论

相关推荐

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

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

    嵌入式TCP/IP协议栈

    3.实现ARP协议、实现IP协议、实现ICMP协议、实现UDP协议、实现socket通信(与linux socket接口一致)、实现DHCP协议、实现DNS协议。4.能够将ping的结果通过串口输出,并能通过串口进行debug,从网络传递过来的应用...

    linux进程之间的通讯综合实例.zip_Linux共享内存_TCP/IP_message_pipe/fifo_shm

    A与B进程之间通过TCP的socket传递 主要掌握socket的流程: A服务器端: socket --&gt;bind----&gt;listen----&gt;accept send read B客户端: socket--&gt;connect-&gt;read send 不懂的可以man一下 man socket B...

    基于TCP的服务器客户端编程讲解.doc

    " "2、写Linux下TCP客户端套接字程序,结合TCP的服务器端程序,实现以下功能: " "(1)、客户根据用户提供的IP地址连接到相应的服务器; " "(2)、服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口...

    基于C_S的学生信息管理系统_linux平台_C语言

    1. 整个工程分为客户端和服务器端,通过TCP/IP协议通信,使用多文件编译并使用条件编译语句防止重复包含头文件 2. 老师和学生的信息使用单链表保存,服务器端关闭后保存至硬盘的文本文件中 3. 使用socket实现客户端...

    FtpServer-FtpClient-master.rar_TCP/IP_constructionf5o_ftpclient_

    运用c语言代码编写的在Linux环境下运行的ftp协议的服务器和客户端 分别在不同的窗口下运行可以实现互相传输文件

    基于LINUX的TCP通信

    基于LINUX下的SOCKET通信,使用TCP协议.服务器将客户端发来的消息,倒序后再发给客户端.

    linux 服务器客户端编程

    服务器和客户端的通讯 gcc *.c -o 可用

    Linux高性能服务器编程

    《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能...

    减少Linux服务器过多的TIME_WAIT

    客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有没有什么情况使主动关闭的socket直接进入CLOSED状态呢? 主动...

    局域网信息发布程序的设计与实现VC+SQL

    主要的功能是基于TCP/IP网络通信技术实现了面向连接的用户与服务器间点对点的通信传输功能,并且应用了多线程以及共享数据结构技术,使网络服务器具有了多用户数据转发的功能,进而解决了局域网多用户间的信息发送的...

    基于嵌入式Linux的远程视频监控系统

    基于TCP/IP的socket编程实现网络通信,将USB摄像头采集到的图像数据进行压缩并通 过网络传输传送到视频服务器客户端。客户端可接受连续帧图像并完成显示,用户可用过 具有Java插件的浏览器实现远程监控的目的。 本文...

    linux网络编程

    IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 滑动窗口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06...

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

    Linux Socket服务器端编程实例 例:建立一个Linux TCP服务器,等待客户端的连接请求,一旦接收到客户端请求,将客户端的IP地址和端口号打印出来,并且向客户端发送"Hello!Socket communication world!"字符串,然后...

    LinuxTCP客户端

    此代码是Linux环境下tcp通信的客户端,内容比较完善,并且经过多次测试,下载只需修改目标服务器的IP地址就行

    TCP socket 套接字传送文件

    通过TCP/IP协议,使用socket套接字在服务器和客户端之间传送文件

    Linux网络编程超级详细笔记

    在Linux下,使用Socket编程可以实现网络通信,包括客户端和服务器端。 IP地址和端口:IP地址是用于标识网络上的设备的唯一地址,而端口则是用于标识进程的地址。在Linux网络编程中,需要了解如何获取和设置IP地址和...

    基于ARM板的局域网聊天工具设计

    用QT设计界面,应用LINUX下的socket网络编程并使用TCP/IP实现基于ARM920T开发板的局域网聊天程序。一台实验箱作为服务器端,多台实验箱作为从机,客户程序启动后首先与服务器连接,连接成功后,从机把聊天信息发送给...

    linux_qq.rar_QQ协议_epoll 文件_linux socket epoll_linux项目_socket好友聊天

    主要是基于TCP/IP协议的socket通信。包括服务器端和客户端两部分,其中客户端使用了select的IO多路复用技术,服务器端由于要监听多个客户端,因此使用了epoll的IO多路复用技术。整个项目目前可以实现的功能有用户的...

    基于VS2019 C++的跨平台(Linux)开发的项目——360 度智能行车辅助系统

    该项目由客户端、服务器构成,采用大并发通信框架思想和自定义协议,基于 TCP/IP 通讯协议封装了包含通信组件、动态数组以及线程池等技术的通信框架。以及基于 OpenCV 的图像处理功能。 功能模块:红绿灯检测、车辆...

Global site tag (gtag.js) - Google Analytics