TCP服务器,实现client发送消息,server接收消息

server.c


#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<pthread.h>

static void usage(const char *proc)
{
 printf("Usage: %s [ip] [port]\n",proc);
}

void *thread_run(void *arg)
{
 printf("create a new thread\n");
 int fd=(int)arg;
 char buf[1024];
 while(1){
  memset(buf,‘\0‘,sizeof(buf));
  ssize_t _s=read(fd,buf,sizeof(buf)-1);
  if(_s>0){
   buf[_s]=‘\0‘;
   printf("client# %s\n",buf);
   write(fd,buf,strlen(buf));
  }else if(_s==0){
   printf("client close...\n");
   break;
  }else{
   printf("read error...\n");
   break;
  }
 }
 return(void *)0;
}

int main(int argc,char *argv[])
{
 if(argc!=3){
  usage(argv[0]);
  exit(1);
 }

//1. creat sock
 int listen_sock=socket(AF_INET,SOCK_STREAM,0);
 if(listen_sock<0){
  perror("socket");
  return 1;
 }

struct sockaddr_in local;
 local.sin_family=AF_INET;
 local.sin_port=htons(atoi(argv[2])); //端口号
 local.sin_addr.s_addr=inet_addr(argv[1]); //IP地址

//2. bind
 if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))<0){
  perror("bind");
  return 2;
 }

//3. listen
 listen(listen_sock,5);

//4. accept
 struct sockaddr_in peer;
 socklen_t len=sizeof(peer);
 while(1){
 int fd=accept(listen_sock,(struct sockaddr*)&peer,&len);
 if(fd<0){
  perror("accept");
  return 3;
 }
 printf("get a new link,socket -> %s:&d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

pthread_t id;
 pthread_create(&id,NULL,thread_run,(void*)fd);

pthread_detach(id);
 }
 return 0;
}

client.c


#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<pthread.h>

static void usage(const char *proc)
{
 printf("Usage: %s [ip] [port]\n",proc);
}

int main(int argc,char *argv[])
{
 if(argc!=3){
  usage(argv[0]);
  exit(1);
 }
 int sock=socket(AF_INET,SOCK_STREAM,0);
 if(sock<0){
  perror("socket");
  return 2;
 }

struct sockaddr_in remote;
 remote.sin_family=AF_INET;
 remote.sin_port=htons(atoi(argv[2])); //argv[2]
 remote.sin_addr.s_addr=inet_addr(argv[1]);//argv[1]

if(connect(sock,(struct sockaddr*)&remote,sizeof(remote))<0){
  perror("connect");
  return 3;
 }

char buf[1024];
 while(1){
  memset(buf,‘\0‘,sizeof(buf));
  printf("please Enter: ");
  fflush(stdout);
  ssize_t _s=read(0,buf,sizeof(buf)-1);
  if(_s>0){
   buf[_s-1]=‘\0‘;
   write(sock,buf,strlen(buf));
   _s=read(sock,buf,sizeof(buf));
   if(_s>0){
    buf[_s]=‘\0‘;
    printf("%s\n",buf);
   }
  }
 }
 return 0;
}

Makefile文件:

.PHONY:all
all:client server
client:client.c
 gcc -o [email protected] $^ -lpthread
server:server.c
 gcc -o [email protected] $^ -lpthread
.PHONY:clean
clean:
 rm -f client server

telnet是远程终端协议

在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。

时间: 2024-10-04 19:01:21

TCP服务器,实现client发送消息,server接收消息的相关文章

TCP 滑动窗口(发送窗口和接收窗口)

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性.同时滑动窗口机制还体现了TCP面向字节流的设计思路. TCP的Window是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16-1=65535个字节. 另外在TCP的选项字段中还包含了一个TCP窗口扩大因子,option-kind为3,option-length为3个字节,option-data取值范围0-14.窗口扩大因子用来扩大TCP窗口,可把原来16bit的窗口,扩大为31b

微信公众号开发教程[003]-消息管理-接收消息

当微信用户向公众号发送消息时,微信服务器会向公众号配置的服务器URL地址发送请求,并将相关内容包装成一定格式的xml发送到这个服务器;响应时,这个服务器只要回复特定格式的xml字符串给微信服务器,微信服务器即可向微信用户的客户端转发这条回复消息.(假设公众号开发模式已开启,以后的教程,如果没有特别说明,都是如此).如下图: 例如,文本消息的xml结构如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> &

使用.net core在Ubuntu构建一个TCP服务器

介绍和背景 TCP编程是网络编程领域最有趣的部分之一.在Ubuntu环境中,我喜欢使用.NET Core进行TCP编程,并使用本机Ubuntu脚本与TCP服务器进行通信.以前,我在.NET框架本身写了一篇关于TCP服务器和客户端的文章.现在,.NET框架本身将是开源的.我想写一些关于他们之间的沟通渠道.基本上,我只是测试在新的.NET环境下工作的情况,而不是在旧的.NET框架环境中工作. 然而,在这篇文章中,我有一大堆的额外功能可供你使用.我将向您展示您将使用的方法来构建自己的TCP服务器,使用

Nodejs创建TCP服务器

Nodejs创建TCP服务器 1.Nodejs提供了net模块给我们,所以我们创建TCP服务器很简单: 1 require('net').createServer(function(socket) { 2 // new connection 3 socket.on('data', function(data) { 4 // got data 5 }); 6 socket.on('end', function(data) { 7 // connection closed 8 }); 9 socke

ActiveMQ 发送和就收消息

一.添加 jar 包 <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.11.2</version> </dependency> 二.消息传递的两种形式 1.点对点:发送的消息只能被一个消费者接收,第一个消费者接收后,消息没了 2.发布/订阅:消息可以被多个消费

TCP 同步传输:客户端发送,服务器段接收

1.服务器端程序 可以在TcpClient上调用GetStream()方法来获的链接到远程计算机的网络流NetworkStream.当在客户端调用时,他获的链接服务器端的流:当在服务器端调用时,他获得链接客户端的流. class Program { static void Main(string[] args) { const int BufferSize = 8192;//缓存大小 Console.WriteLine("server is running ..."); IPAddre

OOBInline属性为false,server接收了client通过sendUrgentData 发送的紧急数据包

 前几天前置上线遇到一问题,大体情况是这样有一个加密服务,对外暴露tcp通讯接口,client端建立连接池,启N个连接(长连接),每次报文通讯之前先通过client端的sendUrgentData(0XFF)方法发送心跳包,用以检测信路是否正常.然后计算待发送报文的长度,将其转换成byte拼在发送报文前面(3字节长)发送报文,服务端read3字节报文并将其转换成报文长度,再根据该长度read定长的报文.测试环境OK没啥问题,上线时出问题了,每次读取的报文长度计算出来为16711680,最后发

ActiveMQ实例1--简单的发送和接收消息

一.环境准备 1,官网http://activemq.apache.org/下载最新版本的ActiveMQ,并解压 2,打开对应的目录,在Mac环境下,一般可以运行命令: cd /Users/***/Downloads/apache-activemq-***/bin/macosx ./activemq start 3,启动成功后,登录http://localhose:8161/admin/,登陆账号和密码都为admin,创建一个queue名为jyQueue. 二.创建Eclipse项目 1,新建

[安卓] 9、线程、VIEW、消息实现从TCP服务器获取数据动态加载显示

一.前言: 一般情况下从TCP服务器读取数据是放在一个线程里读的,但是刷新界面又不得不放在线程外面,所以需要用消息传递把线程里从TCP里获得的数据传送出来,然后根据数据对页面进行相应的刷新. 二.业务逻辑:   这里包含2个layout,第一个用于登陆的(即输入服务器对应的IP和端口号),点击确定进行跳转到相应的监控界面,监控界面包括加热.关闭.和显示温度3个按钮,以及一个用于绘制温度的SurfaceView. 三.详细介绍: 3-1.2个activity介绍: 登陆页面对应的activity,