自定义socket协议(服务端)

自定义协议服务

// server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"Ws2_32")
#define SERVER_PORT 2000 //侦听端口
int main(int argc, char * argv[])
{
 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 0;
    }
    //创建Socket,使用TCP协议
    sListen=socket(AF_INET, SOCK_STREAM, 0);
    if (sListen == INVALID_SOCKET)
    {
        WSACleanup();
        printf("socket() faild!\n");
        //return 0;
    }
    //构建本地地址信息
    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 0;
    }
 
    //侦听连接请求
    ret = listen(sListen, 5);
    if (ret == SOCKET_ERROR)
    {
        printf("listen() faild! code:%d\n", WSAGetLastError());
        closesocket(sListen); //关闭套接字
        //return 0;
    }
 
    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 0;
  }  
  
  unsigned  long   ul = 1; 
  ret = ioctlsocket(sServer,FIONBIO,(unsigned long*)&ul); 
  if(ret==SOCKET_ERROR)
  {
   closesocket(sServer);
   WSACleanup();  
   return -3;
  }
  char receiveMessage[100];
  memset(receiveMessage,0,100);
  nLeft = sizeof(receiveMessage);
  ptr = (char *)&receiveMessage;
  while(nLeft>0)
  {
   //接收数据
   ret = recv(sServer, ptr, 100, 0);
   if (ret == SOCKET_ERROR)
   {
    break;
   }
   if (ret == 0) //客户端已经关闭连接
   {
    printf("Client has closed the connection\n");
    break;
   }
   nLeft -= ret;
   ptr += ret;
  }  
  printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
  
  char sendMessage[]="hello client";  //发送信息给客户端
  send(sServer,sendMessage,strlen(sendMessage)+1,0);  
 } 
 closesocket(sListen);
 closesocket(sServer);
 WSACleanup();
 return 0;
}
时间: 2024-10-13 22:18:40

自定义socket协议(服务端)的相关文章

udp 协议 服务端 | udp 客户端

# ### udp 协议 服务端 import socket # socket.SOCK_DGRAM 代表udp协议 sk = socket.socket(type = socket.SOCK_DGRAM) # 绑定地址 sk.bind( ("127.0.0.1",9000) ) # udp作为服务器,第一次一定是先接受消息 msg,cli_addr = sk.recvfrom(1024) print(msg,cli_addr) msg2 = "对,确实不错,因为今天周五&q

android通过socket连接服务端(PC端)

自己的计算机网络的基础太差了,一个很小的Demo居然搞了快一天,真醉了,不过坑踩多了,自然知道怎么走路了. 首先,是服务端的代码 class Server implements Runnable{ public static void main(){ Thread server = new Thread(new Server()); server.start();} //服务端因为需要接受多个客户端的信息,所以需要一直开放端口等待客户端连入,我就不写try catch了,有点多 public v

C# socket异步 服务端

转自:  http://blog.csdn.net/qq_20282263/article/details/54310737 1 private Dictionary<string, Session> SessionPool = new Dictionary<string, Session>(); 2 private Dictionary<string, string> MsgPool = new Dictionary<string, string>();

TCP协议:服务端和客户端demo--【J2SE】

服务端: import java.net.*; import java.io.*; public class TCPServer{ public static void main(String[] args)throws Exception{ ServerSocket ss=new ServerSocket(6666); while(true){ Socket s =ss.accept();//侦听并接受到此套接字的连接.阻塞式等待 DataInputStream dis=new DataInp

socket创建服务端和客户端

看情况选择相对应的套接字*面向连接的传输--tcp协议--可靠的--流式套接字(SOCK_STREAM)*面向无连接的传输--udp协议--不可靠的--数据报套接字(SOCK_DGRAM) 在liunx中  telnet ip port 可以当成临时客服端 服务端示例: 创建服务端示例: from socket import * #创建套接字(参数:地址族类型,套接字类型,选定子协议类型) sockfd = socket(AF_INET,SOCK_STREAM,proto = 0) #绑定地址(

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation 就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttr

Cocos2dx3.x使用socket创建服务端和客户端改进

由于一个网友使用笔者写的SocketClient作为游戏客户端网络数据接收类,出现了一些问题 这个问题就是因为当执行onRecv时创建了一个Sprite(Sprite::create("1.png")),而创建完成后sprite的数据混乱,或者MoveTo时返回的也是混乱数据.原因在于在多线程申请内存,在主线程使用就会出现问题.为了解决这个问题,特意看了cocos2dx的WebSocket的实现方式,发现当接收到数据时并不是立即调用回调函数,而是将数据信息加入到消息队列,当主线程更新时

Socket通信服务端和客户端总结

服务端:1.创建一个Socket对象.用来侦听的.2.绑定端口和IP3.开启侦听4.开始接受客户端连接5.创建一个代理通信Socket对象.用来通信的.6.发送消息接收消息7.收到客户端的道别,也会回一个:我也走了8.关闭Socket 客户端:1.创建Socket对象2.连接服务器3.发送消息接受消息4.停止连接服务器和客户端都可以.发消息:我要走了.5.关闭Socket

java中socket创建服务端与客户端即时对聊

package tool; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; impo