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

     

  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/hezhangyear/p/4477096.html
Copyright © 2020-2023  润新知