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编程间通信

 三、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\n",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!\n");

41 

42 /*  调用 listen 函数,进行监听  */

43 if(listen(ser_fd,MAX_QUE_CONN_NM)== - 1) 

44 {

45 perror("listen");

46 exit(1); 

47 }

48 printf("Listening......\n");

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\n");

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\n",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\n",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\n");

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]='\0';

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\n",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!\n");

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\n",buf);

63 /* 将服务器处理后的数据读取出来 */

64 if ((rbytes=read(sockfd,buf,100))==-1)

65 {

66 printf("read handle error\n");

67 exit(0);

68 }

69 else 

70 printf("read handle buf is %s \n",buf);

71 close(sockfd);

72 return 0;

73 }

 

四、程序运行结果如下:

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

        客户端结果

 

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

        服务器结果

 五、C#socket()编程

参考资料:http://lanxicy.com/read/9740d8d480de02ad528ada5d.html

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

运行结果如下

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

                 C#TCP客户端

 

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

                C#TCP服务器

 六、由于linux下和C#下都使用了TCP网络编程,所以用linux当作客户端,C#当作服务器,设置好端口号和IP地址,

他们之间是可以通信的,然后在C#下可以把相关的数据写入数据库里面,相关网页再从数据库里面读取相关数据就行了。

运行结果如下

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

      Linux客户端

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

            C#服务器

七、总结心得

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

 

你可能感兴趣的:(socket编程)