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协议的聊天室应用的资源包。这个聊天室的设计与实现充分利用了网络编程中的核心技术,包括TCP/IP套接字、多线程以及数据库存储。以下是这些关键知识点的...
通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现服务器端和客户端之间网络文件的收发。
在本文中,我们将深入探讨如何实现ARM Linux与Windows 10上位机之间的TCP/IP网络通信。这个主题涉及多个技术领域,包括操作系统间的通信、网络编程以及特定的编程语言和库。以下是一份详细的概述: 1. **TCP/IP协议...
- 这部分可能会讲解如何构建一个基本的TCP或UDP网络程序,包括客户端和服务器端的实现。 - 通过示例,学生可以理解数据是如何在不同层次被封装和传递的,例如应用层的数据会被加上TCP头、IP头以及以太网头,然后...
通过分析和学习这个TCP/IP Socket测试sample,开发者可以掌握网络通信的基础,理解客户端和服务器之间的交互流程,以及如何处理并发连接和数据传输。这对于开发网络应用,如即时通讯软件、文件传输服务、在线游戏等...
通过深入理解和实践TCP/IP Socket网络编程,开发者可以构建可靠的网络应用程序,如Web服务器、FTP客户端、邮件服务等,从而参与和推动互联网的发展。北京邮电大学的这门课程为学习者提供了宝贵的资源,有助于提升...
在Linux内核中,TCP/IP协议栈实现了这一系列协议的功能,使得Linux系统能够作为服务器或者客户端进行网络通信。 ### 二、TCP/IP协议栈基础知识 #### 1. 协议层次结构 TCP/IP模型分为四层:应用层、传输层、网络层...
在Linux操作系统中,使用GTK(GIMP Toolkit)开发基于TCP/IP的网络聊天室是一项涉及到多方面技术的任务。GTK是一款强大的跨平台GUI库,用于创建美观的用户界面,而TCP/IP协议族则是互联网通信的基础,提供了可靠的...
网络编程是实现基于TCP/IP的应用程序的关键,包括创建服务器和客户端程序。服务器端通常使用socket监听特定的端口,等待客户端的连接。一旦连接建立,服务器可以接收客户端发送的棋局请求,如落子位置,然后将响应...
本教程将深入探讨如何在Linux环境中构建TCP/IP通信程序,以及如何利用Linux提供的丰富的系统调用和函数来实现这一目标。 首先,TCP(传输控制协议)和IP(互联网协议)是Internet协议栈中的两个关键层,它们构成了...
【基于TCP/IP和Sqlite3数据库的网络通讯录】是一个使用C语言编写的程序,它在Linux环境下运行,实现了基本的通讯录管理功能,包括添加、删除、修改和查询联系人信息。这个项目结合了网络通信和本地数据存储两大核心...
本话题主要探讨如何在Linux操作系统环境下,使用C语言实现基于TCP/IP的文件上传与下载功能。以下将详细介绍相关知识点: 首先,我们需要理解TCP/IP协议族。TCP(传输控制协议)和IP(互联网协议)是最核心的两个...
本话题将深入探讨在Linux下如何构建一个基于TCP/IP协议的CS服务器模型。 首先,让我们理解TCP/IP协议。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它确保数据包按照正确的顺序到达...
本文旨在深入探索Linux环境下TCP/IP协议栈的实现与运作机制,通过跟踪分析Socket编程接口的具体实现细节来理解网络通信的基础原理。文章从Socket编程的角度出发,不仅介绍了Socket的基本概念,还详细阐述了如何通过...
总结,Linux下使用C语言进行TCP/IP通信涉及的知识点包括:socket编程接口、TCP/IP协议原理、连接建立与断开、数据传输以及错误处理。熟练掌握这些内容,能帮助开发者构建稳定、高效的网络应用程序。
内容概要:详细讲解了在Linux环境中TCP/IP网络模型中Socket的应用过程及其核心机制,重点介绍了Socket的概念、意义及其实现过程,通过对服务器端和客户端程序代码的实际分析,让读者更加深刻地理解这一网络通信的...
在Linux系统中,TCP/IP...理解并追踪Linux TCP/IP代码运行涉及众多细节,包括协议实现、内核数据结构、系统调用流程等。通过学习和实践,我们可以更深入地了解网络通信的底层机制,有助于解决网络问题和优化系统性能。
本文将深入讲解如何使用C语言编写Linux下的TCP/IP服务器(Server)和客户端(Client)程序,并通过提供的压缩包文件“TCPIP”中的源代码进行解析。 首先,我们要理解TCP/IP的基本工作原理。TCP(Transmission ...
而TCP部分则涵盖了TCP用户代码、数据报文格式、栈及socket的初始化、服务器端bind、listen、accept的实现、客户端connect发起三次握手的过程,以及TCP报文的接收和三次握手的实现。 通过这份文档,读者可以获得对...