socket通信(C#客户端+Linux_C客户端+Linux_C服务端)

socket也就不介绍了,相关的都很多,可以在在网上搜。环境是本机为win10,再虚拟一台Ubantu作为linux环境。下面是DEMO。

注意 : windos 与 Linux系统有编码差异,windos为GBK, Linux为utf-8,通信时按各自需要转换编码,这里采用通用UTF-8格式。

 

1、Linux_C服务端

  1 #include <sys/types.h>
  2 #include <sys/socket.h>
  3 #include <stdio.h>
  4 #include <netinet/in.h>
  5 #include <arpa/inet.h>
  6 #include <unistd.h>
  7 #include <string.h>
  8 #include <stdlib.h>
  9 #include <fcntl.h>
 10 #include <sys/shm.h>
 11 
 12 #define MYPORT  8887
 13 #define QUEUE   20
 14 #define BUFFER_SIZE 1024
 15 #define RETURN_BUFFER_SIZE 102400
 16 
 17 int main()
 18 {
 19     ///定义sockfd
 20     /*
 21      --------domain用于指定创建套接字所使用的协议族
 22      AF_UNIX # 创建只在本机进行通信的套接字;
 23      AF_INET # 使用IPv4TCP/IP协议;
 24      AF_INET6 # 使用IPv6TCP/IP协议
 25     ---------type用于指定套接字的类型。
 26      SOCK_STREAM # 创建TCP流套接字;
 27      SOCK_DGRAM # 创建DUP套接字;
 28      SOCK_RAW      # 创建原始套接字;
 29      ----------protocol通常设定为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。
 30      */
 31     int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
 32 
 33     ///定义sockaddr_in
 34     struct sockaddr_in server_sockaddr;
 35     server_sockaddr.sin_family = AF_INET;
 36     server_sockaddr.sin_port = htons(MYPORT);
 37     server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 38 
 39     ///bind,成功返回0,出错返回-1
 40     if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
 41     {
 42         perror("bind");
 43         exit(1);
 44     }
 45 
 46     ///listen,成功返回0,出错返回-1
 47     if(listen(server_sockfd,QUEUE) == -1)
 48     {
 49         perror("listen");
 50         exit(1);
 51     }
 52 
 53     ///客户端套接字
 54     char buffer[BUFFER_SIZE];
 55     char returnBuffer[RETURN_BUFFER_SIZE];
 56     struct sockaddr_in client_addr;
 57     socklen_t length = sizeof(client_addr);
 58 
 59     printf("socket server is started! \n");
 60     ///成功返回非负描述字,出错返回-1
 61     int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
 62     if(conn<0)
 63     {
 64         perror("connect");
 65         exit(1);
 66     }
 67 
 68     printf("a Client connected  : %u \n",client_addr.sin_addr.s_addr);
 69 
 70     while(1)
 71     {
 72         int exitMark = 0;
 73         memset(buffer,0,sizeof(buffer));
 74         int len = recv(conn, buffer, sizeof(buffer),0);
 75 
 76 
 77         if(strcmp(buffer,"exit\n")==0)
 78         {
 79             exitMark = 1;
 80 //            attachMsg = "服务器被指定命令[exit]成功关闭!";
 81 //            break;
 82         }
 83         else
 84         {
 85 //            attachMsg = "   this Msg by server send!";
 86         }
 87 
 88 //        strcpy(attachMsg+strlen(attachMsg),buffer);
 89         printf("GetMsg: %s",buffer);
 90 
 91 //        fputs(buffer, stdout);
 92         send(conn, buffer, len, 0);
 93 
 94         if(exitMark)
 95         {
 96             printf("socket server is closed! \n");
 97             break;
 98         }
 99     }
100 
101 
102     close(conn);
103     close(server_sockfd);
104 
105     return 0;
106 }
View Code

2、Linux_C客户端

 1 #include <sys/types.h>
 2 #include <sys/socket.h>
 3 #include <stdio.h>
 4 #include <netinet/in.h>
 5 #include <arpa/inet.h>
 6 #include <unistd.h>
 7 #include <string.h>
 8 #include <stdlib.h>
 9 #include <fcntl.h>
10 #include <sys/shm.h>
11 
12 #define MYPORT  8887
13 #define BUFFER_SIZE 1024
14 
15 int main()
16 {
17     ///定义sockfd
18     int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
19 
20     ///定义sockaddr_in
21     struct sockaddr_in servaddr;
22     memset(&servaddr, 0, sizeof(servaddr));
23     servaddr.sin_family = AF_INET;
24     servaddr.sin_port = htons(MYPORT);  ///服务器端口
25     servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  ///服务器ip
26 
27     ///连接服务器,成功返回0,错误返回-1
28     if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
29     {
30         perror("connect");
31         exit(1);
32     }
33 
34     char sendbuf[BUFFER_SIZE];
35     char recvbuf[BUFFER_SIZE];
36     while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
37     {
38         send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
39         if(strcmp(sendbuf,"exit\n")==0)
40             break;
41         recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
42 //        fputs(recvbuf, stdout);
43         printf("Client GetMsg: %s",recvbuf);
44         memset(sendbuf, 0, sizeof(sendbuf));
45         memset(recvbuf, 0, sizeof(recvbuf));
46     }
47 
48     close(sock_cli);
49     return 0;
50 }
View Code

3、Windos_C#客户端

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net.Sockets;
 7 using System.IO;
 8 using System.Net;
 9 
10 
11 namespace socketClientForLinuxC
12 {
13     class Program
14     {
15         static void Main(string[] args)
16         {
17             string sendMsg = string.Empty;
18             string recvMsg = string.Empty;
19             int sendMark = 0;
20 
21             IPAddress address = IPAddress.Parse("192.168.30.137");
22             IPEndPoint iep = new IPEndPoint(address, 8887);
23             //创建一个Socket
24             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
25             socket.Connect(iep);
26 
27             while (true)
28             {
29                 sendMsg = Console.ReadLine();
30                 if (sendMsg.Equals("exit"))
31                 {
32                     sendMark = 1;
33                 }
34 
35                 byte[] bs = Encoding.UTF8.GetBytes(sendMsg);
36                 socket.Send(bs, bs.Length, 0);
37 
38                 byte[] recvBytes = new byte[1024];
39                 int bytes;
40 
41                 //从服务器端接受返回信息
42                 bytes = socket.Receive(recvBytes, recvBytes.Length, 0);
43                 recvMsg = Encoding.UTF8.GetString(recvBytes, 0, bytes);
44 
45 
46                 if (sendMark == 1) break;
47                 Console.WriteLine(recvMsg);
48             }
49 
50             socket.Close();
51 
52             Console.ReadKey();
53         }
54     }
55 }
View Code

 

posted @ 2016-04-29 17:13  hzer  阅读(282)  评论(0编辑  收藏  举报