windows下用c实现Socket通信

原文: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();
}

时间: 2024-09-23 01:25:02

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

我在做windows下的蓝牙4.0通信编程,想买一个适配器,想问下对适配器有要求吗

问题描述 我在做windows下的蓝牙4.0通信编程,想买一个适配器,想问下对适配器有要求吗 还有程序是怎么与适配器联系的呀,初学,有过开发经验的大神帮帮我吧,急急急,拜托啦 解决方案 没什么要求,京东上30块钱的足够了.注意看清楚支持bluetooth4.0就可以.蓝牙的开发除了配对,其它和网络类似.很简单的.会有一个ip地址.不需要你额外的代码.

android-安卓手机能不能在3G或4G网络下,进行点对点socket通信?

问题描述 安卓手机能不能在3G或4G网络下,进行点对点socket通信? 我试过在wifi的情况下,两个安卓手机可以进行点对点通信,但是在3G或4G网时就不行了,想实现通信必须通过pc服务端. 3G或4G网络下,两台安卓手机能否进行socket点对点通信,如果能的话,是用什么办法呢,有什么例子 解决方案 android 3G网络下Socket通信 解决方案二: 可以的,但是还是需要一个服务器负责建立连接. 解决方案三: 最少有一个设备在公网上啊,或者有一个公网上的服务器中转.或者两个设备在同一个

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

原文:Windows下C语言的Socket编程例子(TCP和UDP) 刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: #include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* ar

解决在Server 2008下突破Rabbitmq的socket限制数的方法

我们利用Rabbitmq进行各类业务系统(如SAP.OA.EHR.KMS.访客系统.AD等)的集成和接口,已有很长一段时间了,初步建立了企业服务总线(ESB).随着新业务系统的不断接入到ESB中,在实践中也发现了一些问题并总结了一些经验,下文主要介绍如何在windows下突破 Rabbitmq的socket限制数,以便为需要使用的同学分享一些实际经验,后续将陆续分享一些技术经验. 第一. RabbitMQ_Limits文档说明 Status of node rabbit@MYSERVER ...

Windows下php socket通信怎么实现多线程操作?

问题描述 Windows下php socket通信怎么实现多线程操作? php socket通信,我想实现多个客户端可以独立连接,接受发送数据,不知道怎么实现,是在Windows下的, 解决方案 创建线程池,每一个链接都对应一个线程

linux虚拟机与windows间socket通信问题

问题描述 linux虚拟机与windows间socket通信问题 虚拟机linux服务端 windows客户端 虚拟机桥接模式,能互相ping到,但运行连接不上 linux Server #include #include #include #include #include #include #include #include #define BACKLOG 5 int main(int arge,char *argv[]) { int sockfd,new_fd; struct sockad

windows编程-windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊?

问题描述 windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊? 似乎sendto函数和recvfrom函数在windows下只能传输char数据或数组,对于int数据或是其他类型数据或结构体都不能传输,这个问题怎么解决啊?我想传输int型数组啊.. ?linux下可是什么类型都能传输啊... 下面是发送函数sendto和接受函数recvfrom的定义: C++系统声明 int PASCAL FAR sendto ( IN SOCKET s, IN const

c-关于Windows下管道通信的问题

问题描述 关于Windows下管道通信的问题 我想要通过管道通信控制CMD,能从父进程读数据就是写不了,WriteFile后没反应,szCOMMAND改成随便一个DOS命令,就是没反应,没辙了,请问代码什么地方出了问题呢? SECURITY_ATTRIBUTES sa; SECURITY_ATTRIBUTES sa1; HANDLE hRead_A, hWrite_A; HANDLE hRead_B, hWrite_B; sa.nLength = sizeof(SECURITY_ATTRIBUT

udp-Linux下socket通信函数原型玄机?(UDP)

问题描述 Linux下socket通信函数原型玄机?(UDP) 编写UDP通讯的程序时发现:ssize_t sendto(int sockfd const void *buf size_t len int flagsconst struct sockaddr *dest_addr socklen_t addrlen);ssize_t recvfrom(int sockfd void *buf size_t len int flagsstruct sockaddr *src_addr sockle