在公司里面,我们平时使用的机器一般都是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 CientSocket;
    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 ", GetLastError());
        return -1;
    }
 
    /* Create Socket */
    CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if ( CientSocket == INVALID_SOCKET )
    {
        printf("Create Socket Failed::%d ", 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(CientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr));
    if ( Ret == SOCKET_ERROR )
    {
        printf("Connect Error::%d ", GetLastError());
        return -1;
    }
    else
    {
        printf("Connect succedded! ");
    }

    while (1)
    {
        scanf("%s", SendBuffer);

  /* send data to server */
        Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
        if ( Ret == SOCKET_ERROR )
        {
            printf("Send Info Error::%d ", GetLastError());
            break;
        }
 
  if('q' == SendBuffer[0])
  {
   break;
  }
    }
  
 /* close socket */
    closesocket(CientSocket);
    WSACleanup();
 
    return 0;
 }