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,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<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!=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;

}

四、程序运行结果如下:

          客户端结果

        服务器结果

五、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协议进行通信,所以即使是跨平台,他们之间还是能进行通信的。

说明一下:转载请注明出处!

时间: 2024-10-05 05:26:54

Linux下TCP网络编程与基于Windows下C#socket编程之间通信的相关文章

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

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

基于linux的TCP网络聊天室设计与实现

利用Linux实现基于TCP模式的网络聊天程序 主要完成的两大组成部分为:服务器和客户端. 服务器程序主要负责监听客户端发来的消息. 客户端需要登录到服务器端才可以实现正常的聊天功能.该程序是利用进程以及共享内存来实现群发送消息的. 以下简单分析一下服务器端和客户端两个方面所要完成的任务. 服务器的主要功能如下: 在特定的端口上进行监听,等待客户端的连接. 用户可以配置服务器端的监听端口. 向连接的客户端发送登录成功信息. 向已经连接到服务器的客户端的用户发送系统消息. 使用TCP多线程并发服务

基于Windows下浏览器无法正常打开的解决方案

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; ms

团队软件开发_基于windows下截屏软件关于NABC框架的特点

经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的快捷键,以便随时随地的截取用户所需要的信息: 2.在截屏开始钱前有一个关于形状的选择(如矩形,圆形等),当然,还有我们小组自认为比较好的随意形状的截图: 3.当随意形状截屏时,此软件还有磁性吸附轮廓的功能,以避免鼠标使用时截屏的轮廓不合理情况:

基于java的简单Socket编程

1TCP协议与UDP协议     1.1 TCP               TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建立连接,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作. TCP的

eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)

明天就回国了,今晚回国前写写如何配置eclipse和CDT.这个配置方法网上讨论不是很多,可能用的人少,毕竟Windows上写C++程序多数喜欢VS,即使写的是Linux程序,很多人仍然会用VS(说只喜欢用VI的人我佩服).的确VS很强大,但我也geek一回,使用eclipse做C++程序(用VI才是真正的geek?好吧,我就这水准了,反正我会用VI,但不习惯VI).希望这篇小小的文章能帮助想在Windows平台上使用gcc/g++和gdb并利用IDE调试程序的人.也希望我们谈到g++和gcc的

Socket编程学习之道:揭开Socket编程的面纱

对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Socket在哪里呢? 3.         Socket是什么呢? 4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为

网络 基于UDP协议的socket编程

一.UDP协议        UDP协议的特点:用户数据包协议             1.UDP协议是无连接的.也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延.             2.UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表.(网上的的可靠性建立在应答的基础上,不提供可靠性交付,即不需要应答,因此不需要维护状态表)             3.UDP是面向报文.发送方