Linux下TCP网络编程与基于Windows下C#Socket编程间通信

一、Linux下TCP网络编程基础,需要了解相关函数

Socket():用于套接字初始化。
Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求。
Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们。
Accept():让服务器接收客户的连接请求。
Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接。
Close():关闭socket
Send():发送函数
Recv():接受函数


二、服务器和客户端流程图如下图所示

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第1张图片

三、Linux下TCP编程实例

TCP服务器程序

/* server.c */

#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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,0))== -1)
	{
		perror("socket");
		exit(1);
	}
	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),8);
	/*  绑定函数 bind */
	if(bind(ser_fd,(struct  sockaddr  *)&server_addr,sizeof(struct 
	sockaddr))==-1)
	{
		perror("bind");
		exit(1); 
	}
	printf("Bind success!\n");

	/*  调用 listen 函数,进行监听  */
	if(listen(ser_fd,MAX_QUE_CONN_NM)== - 1) 
	{
		perror("listen");
		exit(1); 
	}
	printf("Listening......\n");

	/*  调用 accept 函数,等待客户端的连接  */
	if((cli_fd = accept(ser_fd,(struct sockaddr *)&client_addr,&sin_size))==-1)
	{
		perror("accept");
		exit(1); 
	}
	printf("Have client ready for connecting\n");

	/*  调用 recv 函数接收客户端的请求  */
	memset(buf,0,sizeof(buf));
	if((recvbytes = recv(cli_fd,buf,BUFFER_SIZE,0))== -1)
	{
		perror("recv");
		exit(1); 
	}
	/*  将收到的信息(客服端发来的信息)打印出来  */
	printf("Received a message:%s\n",buf); 
	/*对客户端发过来的数据进行处理,只是将首字符加2,再发给客户端*/
	buf[0]=buf[0]+2;
	if( ( wbytes = write(cli_fd,buf,strlen(buf)) ) == -1 )
	{
		perror("handle send");
		exit(1);
	}
	else 
		printf("handle buf is %s\n",buf);
	/*  关闭 socket */
	close(ser_fd);
	return 0;
}


TCP客端程序

/*client*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#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!=3)
	{
		perror("Usage:./clinet IP address Text\n");
		exit(1);
	}
	/*地址解析函数*/
	if( ( host = gethostbyname(argv[1]) ) == NULL )  //得到主机名及相应信息
	{
		perror("gethostbyname");
		exit(1);
	}
	memset(buf,0,sizeof(buf));
	sprintf(buf,"%s",argv[2]);
	buf[strlen(buf)+1]='\0';
	/*建立socket连接,IPv4协议,字节流套接字*/

	if( ( sockfd = socket(AF_INET,SOCK_STREAM,0) ) == -1 )
	{
		perror("socket");
		exit(1);
	}
	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),8);  //等同于memset,清空作用
	/*调用connect函数主动发起对服务器的连接*/
	if( ( connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) ) == -1 )  //第2个参数,指向要连接套接字的sockaddr结构体的指针
	{
		perror("connect");
		exit(1);
	}
	printf("connect server success!\n");
	/*发送消息给服务器端*/
	if( ( sendbytes = send(sockfd,buf,strlen(buf),0) ) == -1 )
	{
		perror("send");
		exit(1);
	}
	else  printf("buf is %s\n",buf);
	/* 将服务器处理后的数据读取出来 */
	if ((rbytes=read(sockfd,buf,100))==-1)
	{
		printf("read handle error\n");
		exit(0);
	}
	else 
		printf("read handle buf is %s \n",buf);
	close(sockfd);
	return 0;
}


四、程序运行结果如下:

客户端结果

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第2张图片


服务器结果

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第3张图片


五、C#socket()编程

参考链接:http://blog.csdn.net/faihung/article/details/70207249

对该资料进行了些修改生成exe文件

运行结果如下

C#TCP客户端

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第4张图片


C#TCP服务器

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第5张图片


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

运行结果如下

Linux客户端

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第6张图片


C#服务器

Linux下TCP网络编程与基于Windows下C#Socket编程间通信_第7张图片


七、总结心得

Linux下的网络编程和Windows下C#网络编程都是使用TCP协议进行通信,所以即使是跨平台,他们之间还是能进行通信的。




你可能感兴趣的:(网络)