原文:windows下用c实现Socket通信

原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊……

下面我贴出来一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

【实际上我们需要完成的二进制流的传输,需要使用unsigned
char来实现,因为c里没有byte数据类型,这里我们不以byte为例,因为效果不会很直观,我们采取最简单的字符串交互。】

【服务器端】

#include "stdafx.h"

#include <stdio.h>

#include <winsock2.h>

#include <winsock2.h>



#define SERVER_PORT 5208 //侦听端口

void main()

{

    WORD
wVersionRequested;

    WSADATA
wsaData;

    int ret,
nLeft, length;

    SOCKET
sListen, sServer; //侦听套接字,连接套接字
   
struct sockaddr_in saServer, saClient; //地址信息

char
*ptr;//用于遍历信息的指针

//WinSock初始化
   
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本

   
ret=WSAStartup(wVersionRequested, &wsaData);

   
if(ret!=0)

    {

       
printf("WSAStartup() failed!\n");

       
return;

    }

    //创建Socket,使用TCP协议
   
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sListen
== INVALID_SOCKET)

    {

       
WSACleanup();

       
printf("socket() faild!\n");

       
return;

    }

    //构建本地地址信息
   
saServer.sin_family = AF_INET; //地址家族
   
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
   
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

  

   
//绑定
   
ret = bind(sListen, (struct sockaddr *)&saServer,
sizeof(saServer));

    if (ret ==
SOCKET_ERROR)

    {

       
printf("bind() faild! code:%d\n", WSAGetLastError());

       
closesocket(sListen); //关闭套接字
       
WSACleanup();

       
return;

    }

  

    //侦听连接请求

    ret =
listen(sListen, 5);

    if (ret ==
SOCKET_ERROR)

    {

       
printf("listen() faild! code:%d\n", WSAGetLastError());

       
closesocket(sListen); //关闭套接字
       
return;

    }

  

   
printf("Waiting for client connecting!\n");

   
printf("Tips: Ctrl+c to quit!\n");

    //阻塞等待接受客户端连接
 while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。

{

  length =
sizeof(saClient);

  sServer = accept(sListen,
(struct sockaddr *)&saClient,
&length);

  if (sServer ==
INVALID_SOCKET)

  {

   printf("accept()
faild! code:%d\n", WSAGetLastError());

   closesocket(sListen);
//关闭套接字
   WSACleanup();

return;

  }

char
receiveMessage[5000];

   nLeft =
sizeof(receiveMessage);

  ptr = (char
*)&receiveMessage;

  while(nLeft>0)

{

   //接收数据

   ret = recv(sServer,
ptr, 5000,
0);
   if
(ret == SOCKET_ERROR)

   {

    printf("recv()
failed!\n");

    return;

}

   if (ret == 0)
//客户端已经关闭连接
   {

printf("Client
has closed the connection\n");

    break;

}

   nLeft -=
ret;

   ptr +=
ret;

  }

printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
 

 } 

  //  closesocket(sListen);

  //  closesocket(sServer);

  //  WSACleanup();

}

【客户端】

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

#include <winsock2.h>

#define SERVER_PORT 5208 //侦听端口
void main()

{

   WORD wVersionRequested;

   WSADATA wsaData;

   int ret;

   SOCKET sClient; //连接套接字
  
struct sockaddr_in saServer; //地址信息
  
char *ptr;

   BOOL fSuccess = TRUE;

//WinSock初始化
  
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本

   ret =
WSAStartup(wVersionRequested, &wsaData);

   if(ret!=0)

   {

       
printf("WSAStartup() failed!\n");

       
return;

   }

   //确认WinSock DLL支持版本2.2

   if(LOBYTE(wsaData.wVersion)!=2
|| HIBYTE(wsaData.wVersion)!=2)

   {

       
WSACleanup();

       
printf("Invalid WinSock version!\n");

       
return;

   }

//创建Socket,使用TCP协议
  
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

   if (sClient ==
INVALID_SOCKET)

   {

       
WSACleanup();

       
printf("socket() failed!\n");

       
return;

   }

//构建服务器地址信息

   saServer.sin_family = AF_INET;
//地址家族

   saServer.sin_port =
htons(SERVER_PORT); //注意转化为网络节序

   saServer.sin_addr.S_un.S_addr
= inet_addr("192.168.1.127");

//连接服务器
  
ret = connect(sClient, (struct sockaddr
*)&saServer, sizeof(saServer));

   if (ret == SOCKET_ERROR)

   {

       
printf("connect() failed!\n");

       
closesocket(sClient); //关闭套接字

       
WSACleanup();

       
return;

   }

 

  

   char sendMessage[]="hello this
is client message!"; 

   ret = send (sClient, (char
*)&sendMessage, sizeof(sendMessage),
0);
   if (ret ==
SOCKET_ERROR)

   {

       
printf("send() failed!\n");

   }

   else

       
printf("client info has been sent!");

   closesocket(sClient);
//关闭套接字

   WSACleanup();

}

windows下用c实现Socket通信的更多相关文章

  1. Windows下C语言的Socket编程例子(TCP和UDP)

    原文:Windows下C语言的Socket编程例子(TCP和UDP) 刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: ...

  2. windows下进程间通信与线程间通信

    进程间通信: 1.文件映射(Memory-Mapped Files) 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/ ...

  3. 成功使Linux服务端和Windows客户端建立socket通信

    一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ...

  4. windows下的C++ socket服务器(1)

    windows下的一个C++ socket服务器,用到了C++11的相关内容,现在还不是很完善,以后会不断改进的! #include <winsock2.h>//1 以后会用这种方式对特定 ...

  5. c++ 网络编程(四) LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运 ...

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

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  7. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  8. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  9. windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)

    1.离线人脸识别本地部署 详情请阅读百度人脸识别官网 2.nodejs做socket通信的客户端 为什么不直接通过调用c++编译的exe获得人脸识别结果? 原因:exe运行时会加载很多模型而消耗很多时 ...

随机推荐

  1. Netty In Action中文版 - 第一章:Netty介绍

    本章介绍 Netty介绍 为什么要使用non-blocking IO(NIO) 堵塞IO(blocking IO)和非堵塞IO(non-blocking IO)对照 Java NIO的问题和在Nett ...

  2. ZOJ 2412 Farm Irrigation(DFS 条件通讯块)

    意甲冠军  两个农田管内可直接连接到壳体  他们将能够共享一个水源   有11种农田  管道的位置高于一定  一个农田矩阵  问至少须要多少水源 DFS的连通块问题  两个相邻农田的管道能够直接连接的 ...

  3. Android应用公布的准备——生成渠道包

    我们须要使用一个变量标明该app的渠道.通常我们能够在manifest中的application节点下声明.例如以下. <meta-data android:name="CHANNEL ...

  4. WPF学习(12)动画

    本篇来学习WPF的动画.什么是动画?动画就是一系列帧.在WPF中,动画就是在一段时间内修改依赖属性值的行为,它是基于时间线Timeline的.有人会说,要动画干嘛,华而不实,而且添加了额外的资源消耗而 ...

  5. 跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

    跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])         写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的 ...

  6. 1067: spark.components:NavigatorContent 类型值的隐式强制指令的目标是非相关类型 String

    1.错误描写叙述 此行的多个标记: -workId -1067: spark.components:NavigatorContent 类型值的隐式强制指令的目标是非相关类型 String. 2.错误原 ...

  7. Vertica对于所计算的时间SQL声明大全

    词:强.大.所有,强烈推荐 SQL语句 查询结果 select (timestamp '2005-01-17 10:00' - timestamp '2005-01-01'); 16 10:10 se ...

  8. Mozilla 构建系统(转)

    英文来源:Mozilla’s Build System 中文出处:开放博客,由灰狐翻译小组制作 Mozilla 构建系统是一个非常酷的分布式系统,运行在BuildBot上.系统能在每次修改后自动重新构 ...

  9. Oracle SQL操作计划基线总结(SQL Plan Baseline)

    一.基础概念 Oracle 11g開始,提供了一种新的固定运行计划的方法,即SQL plan baseline,中文名SQL运行计划基线(简称基线),能够觉得是OUTLINE(大纲)或者SQL PRO ...

  10. Windows下Jekyll安装

    一直用Mac,换了新公司使用的电脑是windows,网上粗略的看了一下Jekyll的安装.简略的实现了一遍 首先安装Ruby Ruby安装文件下载地址 下载对应版本,我的电脑是64位的下载64位的版本 ...