随想录(windows和linux进行socket通信)

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】 


    在公司里面,我们平时使用的机器一般都是windows系统,但是开发、编译的机器往往是linux服务器。通过ping、ftp、samba、telnet、ssh,人们可以很方便与服务器连接。windows系统使用的是windows socket,而linux使用的posix socket,那么这两个socket之间是怎么通信的呢?网上关于windows与windows通信的代码很多,linux与linux通信的代码也很多,但是windows和linux通信的代码很少。这里,我就想写一个简单的socket代码,实现linux和windows的通信。


    其实,广义一点看,网页访问、邮箱、游戏、聊天工具都是利用socket实现的,当然后面实现的逻辑要比我们写的代码复杂的多。但是,我们完全可以利用简单的代码来说明socket通信问题,能做到这一点就足够了。这也是我一直推崇的方法,用最简单的代码表达最实际的功能。


    windows侧的client代码,

#include <stdio.h>#include <Windows.h> #pragma comment(lib,"ws2_32.lib")#define  PORT 4000#define  IP_ADDRESS "192.168.1.102" int main(int argc, char* argv[]){    WSADATA  Ws;    SOCKET ClientSocket;    struct sockaddr_in ClientAddr;    int Ret = 0;    char SendBuffer[MAX_PATH];    /* Init Windows Socket */    if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )    {        printf("Init Windows Socket Failed::%d\n", GetLastError());        return -1;    }     /* Create Socket */    ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if ( ClientSocket == INVALID_SOCKET )    {        printf("Create Socket Failed::%d\n", GetLastError());        return -1;    }    ClientAddr.sin_family = AF_INET;    ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);    ClientAddr.sin_port = htons(PORT);    memset(ClientAddr.sin_zero, 0x00, 8); /* connect socket */    Ret = connect(ClientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr));    if ( Ret == SOCKET_ERROR )    {        printf("Connect Error::%d\n", GetLastError());        return -1;    }    else    {        printf("Connect succedded!\n");    }    while (1)    {        scanf("%s", SendBuffer);  /* send data to server */        Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);        if ( Ret == SOCKET_ERROR )        {            printf("Send Info Error::%d\n", GetLastError());            break;        }    if('q' == SendBuffer[0])  {   break;  }    }     /* close socket */    closesocket(ClientSocket);    WSACleanup();     return 0; } 

    linux侧的server代码,

#include <netinet/in.h>    #include <sys/types.h>    #include <sys/socket.h>    #include <stdio.h>        #include <stdlib.h>       #include <string.h>       #define HELLO_WORLD_SERVER_PORT    4000#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024int main(int argc, char **argv){    struct sockaddr_in server_addr; int server_socket; int opt = 1;       bzero(&server_addr,sizeof(server_addr));      server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htons(INADDR_ANY);    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); /* create a socket */    server_socket = socket(PF_INET,SOCK_STREAM,0);    if( server_socket < 0)    {        printf("Create Socket Failed!");        exit(1);    }     /* bind socket to a specified address*/    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))    {        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);         exit(1);    }    /* listen a socket */    if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))    {        printf("Server Listen Failed!");         exit(1);    }  /* run server */    while (1)     {        struct sockaddr_in client_addr;  int client_socket;          socklen_t length;  char buffer[BUFFER_SIZE];  /* accept socket from client */  length = sizeof(client_addr);        client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);        if( client_socket < 0)        {            printf("Server Accept Failed!\n");            break;        }          /* receive data from client */  while(1)  {   bzero(buffer, BUFFER_SIZE);   length = recv(client_socket, buffer, BUFFER_SIZE, 0);   if (length < 0)   {    printf("Server Recieve Data Failed!\n");    break;   }      if('q' == buffer[0])   {    printf("Quit from client!\n");    break;   }      printf("%s\n", buffer);  }           close(client_socket);    }     close(server_socket);    return 0;}

    windows侧的代码使用vc6.0编译就可以,而linux侧的代码用gcc就ok了,即gcc server.c -o server。首先,在linux侧输入./server,然后打开widnows侧的client程序,然后在windows侧的每一个字符输入都会在linux打印出来。如果想退出,输入q即可。但是此时server不会退出,它在等待下一个client的通信,继续服务于大家,就是这么简单。


    这里的server和client代码是根据网友的代码修改而来,一并表示感谢。如有侵权,请邮件告知。    




           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值