zoukankan      html  css  js  c++  java
  • 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服务器程序

     1 /* server.c */
     2 #include <sys/types.h> 
     3 #include <sys/socket.h>
     4 #include <sys/ioctl.h>
     5 #include <netinet/in.h>
     6 #include <stdio.h>
     7 #include <stdlib.h>
     8 #include <string.h>
     9 #include <unistd.h>
    10 #define PORT   2000    //定义端口号
    11 #define BUFFER_SIZE 1024  
    12 #define MAX_QUE_CONN_NM 5  //最大缓冲队列
    13 int main(void)
    14 {
    15 
    16 /*下面该以太网套接字地址结构体非常重要*/
    17 struct sockaddr_in server_addr,client_addr; 
    18 int sin_size,recvbytes,wbytes;
    19 int ser_fd,cli_fd;  
    20 char buf[BUFFER_SIZE];
    21 /*  建立 socket 连接,IPv4 协议,字节流套接字  */
    22 if((ser_fd = socket(AF_INET,SOCK_STREAM,0))== -1)
    23 {
    24 perror("socket");
    25 exit(1);
    26 }
    27 printf("Socket id = %d
    ",ser_fd);
    28 /*  初始化 sockaddr_in 结构体  */
    29 server_addr.sin_family = AF_INET;
    30 server_addr.sin_port = htons(PORT);
    31 server_addr.sin_addr.s_addr = INADDR_ANY;
    32 bzero(&(server_addr.sin_zero),8);
    33 /*  绑定函数 bind */
    34 if(bind(ser_fd,(struct  sockaddr  *)&server_addr,sizeof(struct 
    35 sockaddr))==-1)
    36 {
    37 perror("bind");
    38 exit(1); 
    39 }
    40 printf("Bind success!
    ");
    41 
    42 /*  调用 listen 函数,进行监听  */
    43 if(listen(ser_fd,MAX_QUE_CONN_NM)== - 1) 
    44 {
    45 perror("listen");
    46 exit(1); 
    47 }
    48 printf("Listening......
    ");
    49 
    50 /*  调用 accept 函数,等待客户端的连接  */
    51 if((cli_fd = accept(ser_fd,(struct sockaddr *)&client_addr,&sin_size))==-1)
    52 {
    53 perror("accept");
    54 exit(1); 
    55 }
    56 printf("Have client ready for connecting
    ");
    57 
    58 /*  调用 recv 函数接收客户端的请求  */
    59 memset(buf,0,sizeof(buf));
    60 if((recvbytes = recv(cli_fd,buf,BUFFER_SIZE,0))== -1)
    61 {
    62 perror("recv");
    63 exit(1); 
    64 }
    65 /*  将收到的信息(客服端发来的信息)打印出来  */
    66 printf("Received a message:%s
    ",buf); 
    67 /*对客户端发过来的数据进行处理,只是将首字符加2,再发给客户端*/
    68 buf[0]=buf[0]+2;
    69 if( ( wbytes = write(cli_fd,buf,strlen(buf)) ) == -1 )
    70 {
    71 perror("handle send");
    72 exit(1);
    73 }
    74 else 
    75 printf("handle buf is %s
    ",buf);
    76 /*  关闭 socket */
    77 close(ser_fd);
    78 return 0;
    79 }

    TCP客端程序

     1 /*client*/
     2 #include<sys/types.h>
     3 #include<sys/socket.h>
     4 #include<sys/ioctl.h>
     5 #include<netinet/in.h>
     6 #include<netdb.h>
     7 #include<stdio.h>
     8 #include<stdlib.h>
     9 #include<string.h>
    10 #include<unistd.h>
    11 #define PORT 2000  //端口号
    12 #define BUFFER_SIZE 1024
    13 int main(int argc,char *argv[])
    14 {
    15 struct sockaddr_in server_addr;
    16 int sockfd,sendbytes,rbytes;
    17 //int ser_fd;
    18 char buf[BUFFER_SIZE];
    19 struct hostent *host;
    20 /*指定输入参数为3个,否则出错*/
    21 if(argc!=3)
    22 {
    23 perror("Usage:./clinet IP address Text
    ");
    24 exit(1);
    25 }
    26 /*地址解析函数*/
    27 if( ( host = gethostbyname(argv[1]) ) == NULL )  //得到主机名及相应信息
    28 {
    29 perror("gethostbyname");
    30 exit(1);
    31 }
    32 memset(buf,0,sizeof(buf));
    33 sprintf(buf,"%s",argv[2]);
    34 buf[strlen(buf)+1]='';
    35 /*建立socket连接,IPv4协议,字节流套接字*/
    36 
    37 if( ( sockfd = socket(AF_INET,SOCK_STREAM,0) ) == -1 )
    38 {
    39 perror("socket");
    40 exit(1);
    41 }
    42 printf("Socket id = %d
    ",sockfd);
    43 
    44 /*初始化sockaddr_in 结构体*/                 
    45 server_addr.sin_family = AF_INET;    //TCP/IP协议簇
    46 server_addr.sin_port = htons(PORT);  // sin_port存储端口号(使用网络字节顺序)  htons将unsigned short从主机字节序转化为网络字节序
    47 server_addr.sin_addr = *((struct in_addr *)host->h_addr); //前面指过的,host主机名及相应信息的指针,这里为IP地址
    48 bzero(&(server_addr.sin_zero),8);   //等同于memset,清空作用
    49 /*调用connect函数主动发起对服务器的连接*/
    50 if( ( connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) ) == -1 )  //第2个参数,指向要连接套接字的sockaddr结构体的指针
    51 {
    52 perror("connect");
    53 exit(1);
    54 }
    55 printf("connect server success!
    ");
    56 /*发送消息给服务器端*/
    57 if( ( sendbytes = send(sockfd,buf,strlen(buf),0) ) == -1 )
    58 {
    59 perror("send");
    60 exit(1);
    61 }
    62 else  printf("buf is %s
    ",buf);
    63 /* 将服务器处理后的数据读取出来 */
    64 if ((rbytes=read(sockfd,buf,100))==-1)
    65 {
    66 printf("read handle error
    ");
    67 exit(0);
    68 }
    69 else 
    70 printf("read handle buf is %s 
    ",buf);
    71 close(sockfd);
    72 return 0;
    73 }

    四、程序运行结果如下:

     

            客户端结果

     

     

            服务器结果

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

     

  • 相关阅读:
    纯CSS实现自动轮播,CSS变量的定义与使用,计算属性的使用
    input:file样式怎样修改
    Div转为Canvas简直不要太好玩~~~
    oracle nvl2函数
    oracle 子查询
    oracle 分组函数执行分析
    oracle外部表
    oracle USING 用法
    面向对象进阶
    面向对象基础
  • 原文地址:https://www.cnblogs.com/hezhangyear/p/4477096.html
Copyright © 2011-2022 走看看