Linux下TCP网络编程与基于Windows下C#socket编程间通信
一、linux下TCP网络编程基础,需要了解相关函数
Socket():用于套接字初始化。
Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求。
Listen():使socket处于被动的监听模式,并为该 socket 建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们。
Accept():让服务器接收客户的连接请求。
Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接。
Close():关闭socket
Send():发送函数
Recv():接受函数
二、服务器和客户端流程图如下图所示

三、linux下TCP编程实例
TCP服务器程序
/* server.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PORT 2000 //定义端口号
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5 //最大缓冲队列
int main(void)
{ /*下面该以太网套接字地址结构体非常重要*/
struct sockaddr_in server_addr,client_addr;
int sin_size,recvbytes,wbytes;
int ser_fd,cli_fd;
char buf[BUFFER_SIZE];
/* 建立 socket 连接,IPv4 协议,字节流套接字 */
if((ser_fd = socket(AF_INET,SOCK_STREAM,))== -)
{
perror("socket");
exit();
}
printf("Socket id = %d\n",ser_fd);
/* 初始化 sockaddr_in 结构体 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),);
/* 绑定函数 bind */
if(bind(ser_fd,(struct sockaddr *)&server_addr,sizeof(struct
sockaddr))==-)
{
perror("bind");
exit();
}
printf("Bind success!\n"); /* 调用 listen 函数,进行监听 */
if(listen(ser_fd,MAX_QUE_CONN_NM)== - )
{
perror("listen");
exit();
}
printf("Listening......\n"); /* 调用 accept 函数,等待客户端的连接 */
if((cli_fd = accept(ser_fd,(struct sockaddr *)&client_addr,&sin_size))==-)
{
perror("accept");
exit();
}
printf("Have client ready for connecting\n"); /* 调用 recv 函数接收客户端的请求 */
memset(buf,,sizeof(buf));
if((recvbytes = recv(cli_fd,buf,BUFFER_SIZE,))== -)
{
perror("recv");
exit();
}
/* 将收到的信息(客服端发来的信息)打印出来 */
printf("Received a message:%s\n",buf);
/*对客户端发过来的数据进行处理,只是将首字符加2,再发给客户端*/
buf[]=buf[]+;
if( ( wbytes = write(cli_fd,buf,strlen(buf)) ) == - )
{
perror("handle send");
exit();
}
else
printf("handle buf is %s\n",buf);
/* 关闭 socket */
close(ser_fd);
return ;
}
TCP客端程序
/*client*/
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/ioctl.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define PORT 2000 //端口号
#define BUFFER_SIZE 1024
int main(int argc,char *argv[])
{
struct sockaddr_in server_addr;
int sockfd,sendbytes,rbytes;
//int ser_fd;
char buf[BUFFER_SIZE];
struct hostent *host;
/*指定输入参数为3个,否则出错*/
if(argc!=)
{
perror("Usage:./clinet IP address Text\n");
exit();
}
/*地址解析函数*/
if( ( host = gethostbyname(argv[]) ) == NULL ) //得到主机名及相应信息
{
perror("gethostbyname");
exit();
}
memset(buf,,sizeof(buf));
sprintf(buf,"%s",argv[]);
buf[strlen(buf)+]='\0';
/*建立socket连接,IPv4协议,字节流套接字*/ if( ( sockfd = socket(AF_INET,SOCK_STREAM,) ) == - )
{
perror("socket");
exit();
}
printf("Socket id = %d\n",sockfd); /*初始化sockaddr_in 结构体*/
server_addr.sin_family = AF_INET; //TCP/IP协议簇
server_addr.sin_port = htons(PORT); // sin_port存储端口号(使用网络字节顺序) htons将unsigned short从主机字节序转化为网络字节序
server_addr.sin_addr = *((struct in_addr *)host->h_addr); //前面指过的,host主机名及相应信息的指针,这里为IP地址
bzero(&(server_addr.sin_zero),); //等同于memset,清空作用
/*调用connect函数主动发起对服务器的连接*/
if( ( connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) ) == - ) //第2个参数,指向要连接套接字的sockaddr结构体的指针
{
perror("connect");
exit();
}
printf("connect server success!\n");
/*发送消息给服务器端*/
if( ( sendbytes = send(sockfd,buf,strlen(buf),) ) == - )
{
perror("send");
exit();
}
else printf("buf is %s\n",buf);
/* 将服务器处理后的数据读取出来 */
if ((rbytes=read(sockfd,buf,))==-)
{
printf("read handle error\n");
exit();
}
else
printf("read handle buf is %s \n",buf);
close(sockfd);
return ;
}
四、程序运行结果如下:

客户端结果

服务器结果
五、C#socket()编程
参考资料:http://lanxicy.com/read/9740d8d480de02ad528ada5d.html
对该资料进行了些修改生成exe文件
运行结果如下

C#TCP客户端

C#TCP服务器
六、由于linux下和C#下都使用了TCP网络编程,所以用linux当作客户端,C#当作服务器,设置好端口号和IP地址,
他们之间是可以通信的,然后在C#下可以把相关的数据写入数据库里面,相关网页再从数据库里面读取相关数据就行了。
运行结果如下

Linux客户端

C#服务器
七、总结心得
linux下的网络编程和Windows下C#网络编程都是使用TCP协议进行通信,所以即使是跨平台,他们之间还是能进行通信的。
Linux下TCP网络编程与基于Windows下C#socket编程间通信的更多相关文章
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 基于Linux的TCP网络聊天室
1.实验项目名称:基于Linux的TCP网络聊天室 2.实验目的:通过TCP完成多用户群聊和私聊功能. 3.实验过程: 通过socket建立用户连接并传送用户输入的信息,分别来写客户端和服务器端,利用 ...
- 团队软件开发_基于windows下截屏软件关于NABC框架的特点
经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的 ...
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...
- 基于Windows下浏览器无法正常打开的解决方案
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- 基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm)
基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm): PS : 有能力的建议购买正版,好吧. PS:均针对其对应的2018.3.1 ...
- 基于C++简单Windows API的socket编程(阻塞模式)
1. 概述:简单的基于Windows API的socket点对点聊天程序,为了方便初学者,本文代码均采用阻塞原理编写. 2. 代码样例 Server.cpp(服务端) #include <cst ...
- 基于java的简单Socket编程
1TCP协议与UDP协议 1.1 TCP TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输 ...
- linux下启动mysql服务(类似于windows下net start mysql)
1.linux系统启动方式:service mysql start.其类似于windows下net start mysql
随机推荐
- gdnz
更新yum库:yum updat yum install epel-release 查看是否安装mysql:rpm -qa|grep -i mysql 移除列表mysql :yum remo ...
- 关于OPC的研究1]c# opc client源码调试和学习笔记
c# opc client是一个在网上下载的示例程序,调试的时候还是费了一番周折,服务器端程序来自king view6.55,另文介绍. 1.注册dll 程序中有一个名叫OPCDAAuto.dll的文 ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- The remote name could not be resolved问题的解决方法
网站如果绑定了代理ip,内部跳转的时候,就会报The remote name could not be resolved错误,这个错误很难排查,网上也没有多少可参考的例子 现在记录下解决方法,以备参考 ...
- 学习笔记-----Android的View绘制过程
边看源码边参考别人的博客等,做一下学习笔记. 要了解View的绘制,首先得知道View树的结构:(可以参考http://blog.csdn.net/qinjuning/article/details/ ...
- Vue 过滤器与计算属性
过滤器 V1.x 版本 过滤器基础 过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数.Vue有很多很便利的过滤器,可以参考官方文档,http://cn.vuejs.org/ ...
- codeforces 704A (队列模拟) Thor
题目:这里 题意:n个app,q个操作,当操作数type为1的时候表示y这个app推送了你一条消息,当操作数type为2的时候表示将y这个app已推送的所有消息都读完,当操作数为3的时候 表示将已经推 ...
- HTTP Client工具类
HTTP Client工具类: import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.ht ...
- 线段树初步&&lazy标记
线段树 一.概述: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a, ...
- 用Python实现一个爬取XX大学电费通知的小脚本
内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...