最近在做windows上一个工具时用到了socket通信,在此记录一下通讯的程序;通讯是以linux端作为服务,windows端作为客户端,下面直接贴程序
服务端:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEFAULT_PORT 8000 #define MAXLINE 4096 int main(int argc, char** argv) { int socket_fd, connect_fd; struct sockaddr_in servaddr; char buff[4096]; int n; //初始化Socket if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //初始化 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。 servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT //将本地地址绑定到所创建的套接字上 if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //开始监听是否有客户端连接 if( listen(socket_fd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1){ //阻塞直到有客户端连接,不然多浪费CPU资源。 if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } //接受客户端传过来的数据 n = recv(connect_fd, buff, MAXLINE, 0); //向客户端发送回应数据 if(!fork()){ if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1) perror("send error"); close(connect_fd); exit(0); } buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connect_fd); } close(socket_fd); }
客户端:
1 TcpClient client = new TcpClient(); 2 IPAddress address = IPAddress.Parse(textBox2.Text); 3 int nPort = 8000; 4 try 5 { 6 client.Connect(address, nPort); 7 } 8 catch (SocketException E) 9 { 10 Console.WriteLine(E.Message); 11 client.Close(); 12 Console.ReadLine(); 13 return; 14 } 15 NetworkStream sockStream = client.GetStream(); 16 string sendMsg = "hello, srver! This is client A"; 17 Byte[] sendBuf = Encoding.ASCII.GetBytes(sendMsg); 18 19 try 20 { 21 sockStream.Write(sendBuf, 0, sendBuf.Length); 22 } 23 catch (SocketException E) 24 { 25 Console.WriteLine(E.Message); 26 sockStream.Close(); 27 client.Close(); 28 Console.ReadLine(); 29 return; 30 } 31 MessageBox.Show("成功向服务器发送消息"); 32 sockStream.Close(); 33 client.Close(); 34 Console.ReadLine();